Python正则表达式

标签 python regex nfa

我有这样的表达:

^(?P<stereo1>/?|\\\\?)(?P<bond1>|=?|\.|#?)(?P<number1>[0-9%]*)(?P<branching>[()]*)(?P<stereo2>/?|\\\\?)(?P<bond2>|=?|\.|#?)(?P<number2>[0-9%]*)$

假设我们有一个字符串'\1' 之后:

re.match(regexp, string)

stereo2 = '\'number2=1

我的问题是:为什么 stereo1 != '\''number1' != '1'

此外,当我们有字符串“/1”时

re.match(regexp,string)

输出:stereo1 = '/', number1 = '1'

最佳答案

当模式包含交替时,正则表达式引擎会尝试从最左边到最后一个分支查找每个分支的匹配项。这是 NFA 引擎的默认行为。因此,如果与最左边的分支匹配,则不会测试其他分支。

您的具体情况发生了什么?

(?P<stereo1>/?|\\\\?)第一个分支成功 /?并匹配空字符串(因为斜杠是可选的),并且第二个分支从未被测试。

何时 (?P<stereo2>/?|\\\\?)到达时,会发生相同的情况,但是当正则表达式引擎到达结束 anchor $ 时,该模式失败。然后正则表达式引擎回溯直到 (?P<stereo2>/?|\\\\?)并测试成功的第二个分支。

注意:DFA 正则表达式引擎具有不同的行为,它测试每个分支并保留具有较大结果的分支。

因此,如果您想使用 stereo1 捕获反斜杠组,你只需要排列分支:(?P<stereo1>\\\\?|/?)

关于Python正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469605/

相关文章:

javascript - 使用javascript增加字符串中第3次出现的数字

php - php 是否有任何特殊字符类,如 [ :alnum:] for regex expressions?

java - Java 中的 NFA 模拟

python - Pandas 中的 Groupby 和插值

python - llvmlite 中的链接 C

mysql 正则表达式使用别名进行搜索

theory - 从正则表达式创建 NFA 的步骤

string - 算法-KMP前缀表: is it possible there are two choices to jump to?

python - 生成具有预定义模数和指数的公钥

python - 如何访问数组?