Python 正则表达式 负向后查找匹配,不带固定宽度

标签 python regex

我想找到更好的方法来获得结果。当且仅当它前面没有非固定宽度的lookbehind项时,我使用正则表达式模式来匹配(DD+一些文本DDDD一些其他文本)形式的所有文本。如何将这些术语包含在我的 REGEX 模式 中?

aa = pd.DataFrame({"test": ["45 python 00222 sometext",
                            "python white 45 regex 00 222 somewhere",
                            "php noise 45 python 65000 sm",
                            "otherword 45 python 50000 sm"]})
pattern = re.compile("(((\d+)\s?([^\W\d_]+)\s?)?(\d{2}\s?\d{3})\s?(\w.+))")
aa["result"] = aa["test"].apply(lambda x: pattern.search(x)[0] if pattern.search(x) else None)
lookbehind = ['python', 'php']
aa.apply(lambda x: "" if any(look in x["test"].replace(x["result"], "") for look in lookbehind) else x["result"], axis=1)

输出是我所期望的

0    45 python 00222 sometext
1                            
2                            
3          45 python 50000 sm

最佳答案

您可以使用一种技巧,在预期匹配之前捕获 phppython,如果该组不为空(如果匹配),则丢弃当前的匹配,否则匹配有效。

查看

pattern = re.compile(r"(?:(php|python).*?)?((?:\d+\s?[^\W\d_]+\s?)?\d{2}\s?\d{3}\s?\w.+)")

该模式包含 2 个捕获组:

  • (?:(php|python).*?)? - 最后一个 ? 使该组可选,它匹配并捕获到组 1 php python,然后 0+ 个字符,尽可能少
  • ((?:\d+\s?[^\W\d_]+\s?)?\d{2}\s?\d{3}\s?\w.+) - 这是第 2 组,基本上是您的模式,没有冗余组。

如果第 1 组匹配,我们需要返回空结果,否则返回第 2 组值:

def callback(v):
    m = pattern.search(v)
    if m and not m.group(1):
        return m.group(2)
    return ""

aa["test"].apply(lambda x: callback(x))

结果:

0    45 python 00222 sometext
1                            
2                            
3          45 python 50000 sm

关于Python 正则表达式 负向后查找匹配,不带固定宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52724641/

相关文章:

python - 为什么在python中执行惰性初始化是线程安全的?

javascript - UIWebView 的 JavaScript 评估器是否能够使用 JS 的 RegExp 对象?

regex - 在 bash 脚本中使用正则表达式

regex - 仅在字符串开头或空格后匹配

python - 计算分支绑定(bind)背包中包含的项目

python - 为什么我们更喜欢使用 self.method() 而不是 Class.method(self)

python - Apache mpm 事件共享内存错误 - 打开输出流编码器时出现 ffmpeg-python 错误 #0 :1 when accessed by multiple instances

java - 正则表达式匹配仅重复 2 位数字的数字

C#:带有数字和中间斜线的正则表达式

python - 如何生成等距插值