【问题标题】:lookbehind for start of string or a character向后查找字符串或字符的开头
【发布时间】:2015-06-15 08:54:44
【问题描述】:

命令

re.compile(ur"(?<=,| |^)(?:next to|near|beside|opp).+?(?=,|$)", re.IGNORECASE)

抛出一个

sre_constants.error: look-behind requires fixed-width pattern

我的程序出错,但regex101 显示它没问题。

我在这里要做的是匹配地址中的地标(每个地址都在一个单独的字符串中),例如:

  • "Opp foobar, foocity" --> 必须匹配 "Opp foobar"
  • “Fooplace, near barplace, barcity” --> 必须匹配“near barplace”
  • “Fooplace, Shoppers Stop, foocity”--> 不能匹配任何内容
  • “Fooplace, opp barplace”--> 必须匹配“opp barplace”

后视是避免匹配带有opp的单词(如字符串3)。

为什么会抛出这个错误?有没有替代我正在寻找的东西?

【问题讨论】:

  • 为什么:&lt;space&gt;, 是 1 宽度,^ 是 0 宽度,Python 无法处理不匹配。
  • regex101.com/r/lX0mL2/1 - “在字符串的开头,或者前面有空格或逗号”(?&lt;=,| |^) 可以重写为“前面没有不是空格或逗号的东西”(?&lt;![^ ,]) (总是 1-width 的断言,但由于它是 negative 它也将匹配字符串的开头)。

标签: regex python-2.7 regex-lookarounds


【解决方案1】:
re.compile(ur"(?:^|(?<=[, ]))(?:next to|near|beside|opp).+?(?=,|$)", re.IGNORECASE)

您可以使用[]| 组合3 条件。查看演示。

https://regex101.com/r/vA8cB3/2#python

【讨论】:

    【解决方案2】:

    在下面的正则表达式中使用re.findall,因为如果存在任何捕获组,re.findall 必须返回捕获组内的内容。

    re.compile(ur"(?m)(?:[, ]|^)((?:next to|near|beside|opp).+?)(?:,|$)", re.IGNORECASE)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多