代码之家  ›  专栏  ›  技术社区  ›  Hackerds

在正则表达式中捕获多个组不会返回任何结果

  •  0
  • Hackerds  · 技术社区  · 6 年前

    我有一个python函数

    def regex(series, regex):
        series = series.str.extract(regex)
        series1 = series.dropna()
        return (series1)
    

    将正则表达式与以下模式匹配:

    • 任何后跟(一组单词)或“否”的单词都不应匹配。下面是python函数中使用的正则表达式:

      result = regex(df['col'],r'(^(?!.*\bno\b.*\b(text|sample text )\b)(?!.*\b(text|sample text)\b .*not).+$)')

    在函数中应用regex时,我没有得到任何结果(只是一个空数据帧), enter image description here

    但是在这个链接中测试regex效果很好 https://regex101.com/r/Epq0Ns/21

    2 回复  |  直到 6 年前
        1
  •  1
  •   ctwheels    6 年前

    密码

    为了简单起见,实际上可以使用列表和列表理解来构建简单的正则表达式模式。

    用法

    See code in use here

    import re
    
    negations = ["no", "not"]
    words = ["text", "sample text", "text book", "notebook"]
    sentences = [
        "first sentence with no and sample text",
        "second with a text but also a not",
        "third has a no, a text and a not",
        "fourth alone is what is neeeded with just text",
        "keep putting line here no"
    ] 
    
    for sentence in sentences:
        negationsRegex = re.compile(r"\b(?:" + "|".join([re.escape(n) for n in negations]) + r")\b")
        wordsRegex = re.compile(r"\b(?:" + "|".join([re.escape(w) for w in words]) + r")\b")
        if not (re.search(negationsRegex, sentence) and re.search(wordsRegex, sentence)):
            print sentence
    

    以上代码输出 :

    fourth alone is what is neeeded with just text
    keep putting line here no
    

    解释

    该代码编译一个regex转义词的连接列表,确保设置了单词边界。生成的结果正则表达式(给定列表 negations 和“文字”)如下:

    \b(?:no|not)\b
    \b(?:text|sample text|text book|notebook)\b
    

    这个 if 语句然后检查生成的模式(否定regex和单词regex)是否与句子匹配。如果两个表达式都不匹配(一个或两个都不匹配),则返回字符串。

        2
  •  0
  •   Iliyan Bobev    6 年前

    尝试使用在regex101上使用的相同标志-将函数中的行更改为:

    series = series.str.extract(regex, re.M | re.S)
    

    series = series.str.extract(regex, flags=re.M|re.S)
    

    如果您有输入定义的代码,我会进行测试。