【问题标题】:python's re: return True if string contains regex patternpython re:如果字符串包含正则表达式模式,则返回True
【发布时间】:2012-02-19 04:27:29
【问题描述】:

我有一个这样的正则表达式:

regexp = u'ba[r|z|d]'

如果单词包含 bar、baz 或 bad,则函数必须返回 True。 简而言之,我需要 Python 的正则表达式模拟

'any-string' in 'text'

我怎样才能意识到这一点?谢谢!

【问题讨论】:

  • 只需使用bool(re.search('ba[rzd]', 'sometext'))。
  • 我第一次在 Python 中使用bool。这很棒。
  • @RaymondHettinger 为什么需要bool?
  • @igorkf 您可以使用bool 进行打字。例如def f(x: bool) -> bool: ... body etc 干杯!

标签: python regex


【解决方案1】:
import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
  print('matched')

【讨论】:

  • 我正在处理一个类似的案例,我想搜索一个确切的字符串 (xyz) 并想知道哪种方法更有效,我应该使用 python 的 'xyz' in given_text或使用re.compile(r'xyz').search(given_text) ?
  • [] 括号包含一个字符类,所以你的 re 也匹配:>>> word = 'ba|'; regexp.search(word) <_sre.sre_match object at> 。您可以删除所有管道符号。
  • 为什么你的字符串前面需要r?即re.compile(r'x[\d+]')与re.compile('x[\d+]')有什么区别?
【解决方案2】:

目前最好的是

bool(re.search('ba[rzd]', 'foobarrrr'))

返回真

【讨论】:

  • 为什么这个比其他解决方案更好?
  • 一方面,它返回一个bool。 OP:“如果单词包含 bar、baz 或 bad,则必须返回 True。”其他答案使用if 的行为 - 将表达式自动转换为bool。例如import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar') => &lt;re.Match object; span=(2, 5), match='bar'&gt;,但 if(rgx.search(w)): print('y') => y。 Closest to documentation of auto-convert I could find(archived)
  • 为什么你更喜欢.search 和.match?
  • 还有你为什么不在正则表达式前面使用r,例如re.compile(r'x[\d+]') 与 re.compile('x[\d+]')?
【解决方案3】:

Match 对象始终为真,如果不匹配则返回None。只测试真实性。

代码:

>>> st = 'bar'
>>> m = re.match(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
...
'bar'

输出 = bar

如果你想要search 功能

>>> st = "bar"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m is not None:
...     m.group(0)
...
'bar'

如果没有找到regexp

>>> st = "hello"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
... else:
...   print "no match"
...
no match

正如@bukzor 提到的,如果 st = foo bar 比匹配将不起作用。所以,用re.search比较合适。

【讨论】:

  • 据我了解,OP 实际上想要search 而不是match。 (见docs.python.org/library/re.html#matching-vs-searching.)另外,我认为如果你以正确的顺序展示实际可能的论点,而不是仅仅...,这将是有帮助的。
  • 如果你把st改成"foo bar",这里的匹配方法就不起作用了。你想要搜索。
  • @ruakh 该链接不再自动滚动到文档的该部分,现在链接为docs.python.org/2/library/re.html#search-vs-match
  • @RanRag 使用in 和regex 搜索子字符串的复杂度差异是什么?
【解决方案4】:

这里有一个功能可以满足你的需求:

import re

def is_match(regex, text):
    pattern = re.compile(regex)
    return pattern.search(text) is not None

正则表达式搜索方法在成功时返回一个对象,如果在字符串中没有找到该模式,则返回 None。考虑到这一点,只要搜索返回了一些东西,我们就会返回 True。

例子:

>>> is_match('ba[rzd]', 'foobar')
True
>>> is_match('ba[zrd]', 'foobaz')
True
>>> is_match('ba[zrd]', 'foobad')
True
>>> is_match('ba[zrd]', 'foobam')
False

【讨论】:

    【解决方案5】:

    你可以这样做:

    使用搜索将返回一个 SRE_match 对象,如果它与您的搜索字符串匹配。

    >>> import re
    >>> m = re.search(u'ba[r|z|d]', 'bar')
    >>> m
    <_sre.SRE_Match object at 0x02027288>
    >>> m.group()
    'bar'
    >>> n = re.search(u'ba[r|z|d]', 'bas')
    >>> n.group()
    

    如果不是,它将返回无

    Traceback (most recent call last):
      File "<pyshell#17>", line 1, in <module>
        n.group()
    AttributeError: 'NoneType' object has no attribute 'group'
    

    只是打印出来再次演示:

    >>> print n
    None
    

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2023-02-07
      • 2018-07-23
      • 2015-04-23
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多