【问题标题】:Find string not preceded by other string查找前面没有其他字符串的字符串
【发布时间】:2018-12-14 23:51:36
【问题描述】:

我只想在这里得到['bar']:

>>> re.findall(r"(?<!\bdef )([a-zA-Z0-9.]+?)\(", "def foo(): bar()")
['oo', 'bar']

这可能在单个正则表达式中吗?如果没有,我会先用这个:re.sub(r"\bdef [a-zA-Z0-9.]+", "", "def foo(): bar()")

【问题讨论】:

  • 使用\b(?&lt;!\bdef )([a-zA-Z_][\w.]*)\(。单词边界将使单词内部的匹配变得不可能。
  • 在后面添加\b。
  • @Aran-Fey 最好将\b 放在lookbehind 之前,以便仅在单词边界位置之后执行。

标签: python regex python-3.x


【解决方案1】:

当前正则表达式匹配foo 中的oo,因为oo( 前面没有"def "。

要阻止模式在单词内匹配,您可以使用单词边界\b,修复可能类似于r"\b(?&lt;!\bdef )([a-zA-Z0-9.]+?)\("。

请注意,标识符可以与[a-zA-Z_][a-zA-Z0-9_] 匹配,因此您的模式可以像这样增强

re.findall(r'\b(?<!\bdef\s)([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)\(', s, re.A)

请注意,re.A or re.ASCII 将使 \w 仅匹配 ASCII 字母、数字和 _。

请参阅regex demo。

详情

  • \b - 单词边界
  • (?&lt;!\bdef\s) - 不允许 def + 当前位置左侧紧邻的空间
  • ([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*) - 捕获组 1(其值将是 re.findall 调用的结果):
    • [a-zA-Z_] - ASCII 字母或 _
    • \w* - 1+ 个单词字符
    • (?: - 一个匹配序列的非捕获组的开始...
      • \. - 一个点
      • [a-zA-Z_] - ASCII 字母或 _
      • \w* - 1+ 字字符
  • )* - ... 零次或多次
  • \( - ( 字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多