【问题标题】:Regular expression: Match everything after a particular word正则表达式:匹配特定单词之后的所有内容
【发布时间】:2018-12-21 22:59:18
【问题描述】:

我正在使用 Python,并希望匹配 test 之后的所有单词,直到遇到句号(句号)或空格。

text = "test : match this."

目前,我正在使用:

import re
re.match('(?<=test :).*',text)

上面的代码不匹配任何东西。我需要match this 作为我的输出。

【问题讨论】:

  • 你的表达不正常吗?如果是这种情况,请提供它产生的输出。
  • 请指定您期望的输出:“match”、“match this”或“match this”。请告诉我们它究竟是如何不起作用的。
  • 好吧,我用的不起作用:-)
  • 您想匹配特定的单词子集吗?因为如果您只想在测试后提取所有单词,您可以使用子集。
  • 您需要使用re.search。像往常一样匹配尝试从一开始就匹配。

标签: python regex


【解决方案1】:

您需要使用 re.search,因为 re.match 尝试从字符串的开头进行匹配。匹配直到遇到空格或句点。

re.search(r'(?<=test :)[^.\s]*',text)

匹配所有字符直到遇到句点,

re.search(r'(?<=test :)[^.]*',text)

【讨论】:

    【解决方案2】:

    在一般情况下,如标题所述,您可以捕获 (.*) 模式在您想要的任何模式之后除换行符之外的任何 0 个或多个字符:

    import re
    p = re.compile(r'test\s*:\s*(.*)')
    s = "test : match this."
    m = p.search(s)           # Run a regex search anywhere inside a string
    if m:                     # If there is a match
        print(m.group(1))     # Print Group 1 value
    

    如果您希望. 匹配多行,请使用re.DOTALLre.S 标志编译正则表达式(或在模式前添加(?s)):

    p = re.compile(r'test\s*:\s*(.*)', re.DOTALL)
    p = re.compile(r'(?s)test\s*:\s*(.*)')
    

    但是,it will retrun match this.。另请参阅regex demo

    您可以在(.*) 之后添加\. 模式,以使正则表达式引擎在该行的最后一个. 之前停止:

    test\s*:\s*(.*)\.
    

    Watch out for re.match() 因为它只会在字符串的开头寻找匹配项(Avinash aleady 指出了这一点,但这是一个非常重要的注意事项!)

    查看regex demosample Python code snippet

    import re
    p = re.compile(r'test\s*:\s*(.*)\.')
    s = "test : match this."
    m = p.search(s)           # Run a regex search anywhere inside a string
    if m:                     # If there is a match
        print(m.group(1))     # Print Group 1 value
    

    如果您想确保 test 与整个单词匹配,请在其前面添加 \b(不要从字符串文字中删除 r 前缀,否则 '\b' 将匹配 BACKSPACE 字符!) - r'\btest\s*:\s*(.*)\.'.

    【讨论】:

      【解决方案3】:

      如果您只是从字符串中获取子集,我不明白您为什么要使用正则表达式。

      同样的方法:

      if line.startswith('test:'):
          print(line[5:line.find('.')])
      

      示例:

      >>> line = "test: match this."
      >>> print(line[5:line.find('.')])
       match this
      

      正则表达式很慢,设计起来很尴尬,也很难调试。肯定有使用它的场合,但如果你只是想提取test:. 之间的文字,那我认为不是其中一种场合。

      见:https://softwareengineering.stackexchange.com/questions/113237/when-you-should-not-use-regular-expressions

      为了获得更大的灵活性(例如,如果您正在循环遍历要在字符串开头找到的字符串列表,然后将其索引出来)将索引中的 5('test:' 的长度)替换为 @987654326 @。

      【讨论】:

      • 我完全同意。我通常会尽量避免使用正则表达式。但是我需要在大量网页中匹配很多其他字符串。
      • 它们有什么不同吗?不能以类似的方式看到它们吗?
      • 刚刚浏览了您提供的链接。很有意思。你让我重新考虑我的方法!
      • @Amith 我同意,没有附加条件 :) 我自己喜欢提供 2 种解决方案,基于正则表达式和非正则表达式。这次不用了。
      • @Amith,没问题。正则表达式是很容易被滥用的东西之一。
      【解决方案4】:

      测试后的一切,包括测试

      test.*
      

      一切都经过测试,未经测试

      (?<=test).*
      

      Example here on regexr.com

      【讨论】:

      • 这应该是公认的答案,又快又简单
      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多