【问题标题】:Python match a string with regexPython将字符串与正则表达式匹配
【发布时间】:2013-10-18 11:08:30
【问题描述】:

我需要一个 python 正则表达式来检查字符串中是否存在单词。字符串可能用逗号分隔。

例如,

line = 'This,is,a,sample,string'

我想根据“样本”进行搜索,这将返回 true。我对 reg ex 很不满意,所以当我查看 python 文档时,我看到了类似

import re
re.match(r'sample', line)

但我不知道为什么要匹配的文本前有一个“r”。有人可以帮我处理正则表达式吗?

【问题讨论】:

  • 你为什么想要一个正则表达式? if 'sample' in line: 更适合匹配特定的子字符串。
  • 谢谢,我想我会同意的。澄清一下,这对于 "sample" 和 "this,is,a,sample" 会返回 true 吗?
  • 是的,对于任何包含“样本”的内容,它将返回 True。如果您实际上不需要匹配更复杂的模式,那么正则表达式就显得多余了。
  • 很好,感谢您的提示。
  • 如果字符串是samplestring,otherstring,应该是什么行为?在给定的答案中,sample 将匹配字符串。如果您只想与逗号分隔列表中的项目完全匹配,则必须做一些更复杂的事情。

标签: python regex


【解决方案1】:

一个Liner实现:

a=[1,3]
b=[1,2,3,4]
all(i in b for i in a)

【讨论】:

    【解决方案2】:

    正如其他人所提到的,最好使用“in”运算符,它也可以作用于列表:

    line = "This,is,a,sample,string"
    lst = ['This', 'sample']
    for i in lst:
         i in line
    
    >> True
    >> True
    

    【讨论】:

      【解决方案3】:

      您确定需要正则表达式吗?似乎您只需要知道字符串中是否存在单词,因此您可以这样做:

      >>> line = 'This,is,a,sample,string'
      >>> "sample" in line
       True
      

      【讨论】:

      • 问题是它可能不是一个逗号分隔的列表。我的输入可以是“Sample”,也可以是“This,is,a,Sample”
      • 你不需要拆分它。如果可搜索是字符串,它将查找子字符串。如果它是一个列表,它将在该列表中查找一个项目
      • @mlnyc 是对的,拆分会创建一个单词列表,然后您将这些单词与给定单词进行比较,但 "sample" in line 会查找与您的单词匹配的子字符串。
      • 这实际上帮助了我,所以我标记为已接受。但是,我不确定它是否与问题的标签最对应,如果其他人正在搜索相同的东西......哦,好吧。
      • @Zack 没关系。如果他们有同样的问题,他们知道有些东西比正则表达式更容易使用:)
      【解决方案4】:

      r 使字符串成为raw string,它不处理转义字符(但是,由于字符串中没有转义字符,因此这里实际上不需要它)。

      另外,re.match 从字符串的开头匹配。换句话说,它在字符串和模式之间寻找 exact 匹配。要匹配字符串中任何位置的内容,请使用re.search。请看下面的演示:

      >>> import re
      >>> line = 'This,is,a,sample,string'
      >>> re.match("sample", line)
      >>> re.search("sample", line)
      <_sre.SRE_Match object at 0x021D32C0>
      >>>
      

      【讨论】:

      • 我可能需要从头开始搜索,我正在寻找的单词可能是第一个
      • @Zack - 我的错 - 我需要更好地解释。 re.search 将匹配最先出现的内容。阅读我编辑的帖子。
      【解决方案5】:

      您不需要正则表达式来检查字符串中是否存在子字符串。

      line = 'This,is,a,sample,string'
      result = bool('sample' in line) # returns True
      

      如果你想知道一个字符串是否包含一个模式,那么你应该使用re.search

      line = 'This,is,a,sample,string'
      result = re.search(r'sample', line) # finds 'sample'
      

      这最好与模式匹配一​​起使用,例如:

      line = 'my name is bob'
      result = re.search(r'my name is (\S+)', line) # finds 'bob'
      

      【讨论】:

        【解决方案6】:

        r 代表原始字符串,所以像 \ 这样的东西会被 Python 自动转义。

        通常,如果您希望您的模式包含反斜杠之类的内容,则需要使用另一个反斜杠对其进行转义。原始字符串消除了这个问题。

        short explanation

        在你的情况下,这并不重要,但早点进入是一个好习惯,否则如果你不小心,像 \b 这样的东西会在你后面咬你(将被解释为退格字符而不是单词边界)

        根据 re.match 与 re.search,这里有一个示例可以为您澄清:

        >>> import re
        >>> testString = 'hello world'
        >>> re.match('hello', testString)
        <_sre.SRE_Match object at 0x015920C8>
        >>> re.search('hello', testString)
        <_sre.SRE_Match object at 0x02405560>
        >>> re.match('world', testString)
        >>> re.search('world', testString)
        <_sre.SRE_Match object at 0x015920C8>
        

        所以搜索会在任何地方找到匹配,匹配只会从开头开始

        【讨论】:

          猜你喜欢
          • 2020-06-12
          • 2019-05-01
          • 2022-01-17
          • 1970-01-01
          • 2020-11-29
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多