4

这是我尝试使用 re 模块在 python 中制作的模式对象。我想要的是接受字符串 "(\exists x)(Px*Qx)" 并只找到 "Px*Qx" 部分的东西。我想我会尝试使用前瞻和后瞻断言。我不确定我是否使用了这个错误或者 ( 字符是否有问题。

p = re.compile(r'?<=[(]\w+?=[)]')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.7/re.py", line 244, in _compile
    raise error, v # invalid expression
sre_constants.error: nothing to repeat
4

1 回答 1

3

问题

  1. 您需要将标记放入一个组中以应用后视(在周围添加括号):(?<=[(]\w+(?=[)]))

  2. Python不支持在lookbehind 中重复变量。所以,你不能\w+在那里写。

  3. 只有后视的正则表达式不匹配!Lookbehind 的意思是“尝试匹配这个东西,然后保持在相同的起始位置以匹配正则表达式的后面部分。” 但是,就您而言,没有以下部分。所以,没有什么匹配的。

解决方案

如果要获取最后一个括号内的文本:

^.*\((.*?)\)$

如果您想跳过第一个括号并获取剩余部分删除括号:

^\(.*?\)\((.*)\)$

请更具体地定义您想要的内容,以便我可以帮助您编写正确的正则表达式。

于 2012-08-31T09:18:24.670 回答