【问题标题】:Python regex lookahead assertionPython 正则表达式前瞻断言
【发布时间】:2020-12-10 16:11:09
【问题描述】:

我想从 text = "otherstuff word1 + word2" 这样的文本字符串中获取 word1 和 word2。

我设法使用这个后向正则表达式得到一个词:

r1 = re.search(r'(?<=\+\s)\w+', text) # Get word2

但每当我尝试对前瞻执行相同操作时,正则表达式它不会返回任何内容

r2 = re.search(r'(?=(\s\+))\w+', text) # Get None

我做错了什么?

【问题讨论】:

  • 这个模式(?=(\s\+))\w+ 断言从当前位置直接向右的应该是一个空白字符,但是你用一个不匹配的字符开始匹配。
  • 您可以使用单个模式和 2 个捕获组 (\w+)\s\+\s(\w+) regex101.com/r/Ab94gT/1 或反之 (?&lt;=\+\s)\w+|\w+(?=\s\+) regex101.com/r/FRk5Hs/1 来获取这两个词

标签: python regex


【解决方案1】:

你能试试这个吗?刚刚交换了\w+(?=(\s\+)) 的位置。


r2 = re.search(r'\w+(?=(\s\+))', text)

【讨论】:

    【解决方案2】:

    我做错了什么?

    此模式(?=(\s\+))\w+ 断言从当前位置直接向右的内容应该是一个空白字符\s,但随后您以一个不匹配的单词字符\w 开始匹配。

    您可以通过使用带有交替 | 的单一模式来获取这两个词,并切换环视的顺序。

    (?<=\+\s)\w+|\w+(?=\s\+)
    

    Regex demo


    要同时获得这两个词,您还可以使用 2 个捕获组而不是环视:

    (\w+)\s\+\s(\w+)
    

    Regex demo

    import re
    
    pattern = r"(\w+)\s\+\s(\w+)"
    s = "otherstuff word1 + word2."
    print(re.findall(pattern, s))
    

    输出

    [('word1', 'word2')]
    

    【讨论】:

      猜你喜欢
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2013-08-19
      • 1970-01-01
      • 2018-12-28
      • 2012-04-14
      • 1970-01-01
      相关资源
      最近更新 更多