【问题标题】:Ignoring irrelevant section in regex忽略正则表达式中不相关的部分
【发布时间】:2021-12-28 09:36:31
【问题描述】:

我有以下文字:(这与this密切相关但不相似)

text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'

我希望只选择第 7 节,以便获得:

7.  A B C

7.1 bla bla bla .

7.2 another bla bla 

7.3 and another one.

所以我这样做:

print(re.findall(r'^\d+\.\s*A B C[^\S\n]*(?:\n\n.+)*', text, re.M)[0])

给出:

7.  A B C

7.1 bla bla bla .

7.2 another bla bla 

7.3 and another one.

8.  X Y Z

8.1 ha ha ha 

(a) hohoho ;

(b) hihihi,

8

如您所见,88.1 之后。所以这似乎对正则表达式感到困惑,我想知道在这种情况下我能做什么?

请注意,部分的数量通常可以不同,所以我不能做类似的事情 re.findall(r'^7\..*', text, re.MULTILINE)(即A B C可以放在其他部分)。

【问题讨论】:

    标签: python regex string text


    【解决方案1】:

    你可以使用

    ^(\d+\.)\s*A B C(?:\s*\n\1\b.*)*
    
    • ^ 字符串开始
    • (\d+\.)\s*A B C 捕获组 1 以匹配 1+ 位和 .,然后匹配 A B C
    • (?:非捕获组整体匹配
      • \s*\n 匹配可选的空白字符和换行符
      • \1\b 对第 1 组的反向引用,后跟单词边界
      • .* 匹配该行的其余部分
    • )*关闭非捕获组并选择性地重复它

    查看regex demo

    import re
    
    text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'
    pattern = r"^(\d+\.)\s*A B C(?:\s*\n\1\b.*)*"
    
    m = re.search(pattern, text, re.MULTILINE)
    if m:
        print(m.group())
    

    输出

    7.      A B C
    
    7.1     bla bla bla .
    
    7.2     another bla bla 
    
    7.3     and another one.
    

    【讨论】:

    • print(re.findall(r'^(\d+)\.\sABC(?:\s*\n\1\b.)*', text, re.M)[0]) 只打印 [7] 没有 7.1、7.2 等。我错过了什么吗?
    • @Wiliam re.findall 将打印捕获组的值。您可以使用 re.search 查找单个匹配项,或者在有多个匹配项时使用 re.finditer。我在答案中添加了一个 Python 示例。
    【解决方案2】:

    这里是找到7. 和第一个8. 之间的行的潜在解决方案:

    m = re.search(r'^7\.\s*(?:.|\n)+?(?=\n8\.)', text, re.MULTILINE)
    print(m.group() if m else None)
    

    输出:

    7.  A B C
    
    7.1 bla bla bla .
    
    7.2 another bla bla 
    
    7.3 and another one.
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-29
      • 2018-08-24
      • 2021-09-23
      • 2012-05-26
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多