【问题标题】:How to escape special regex characters in a string?如何转义字符串中的特殊正则表达式字符?
【发布时间】:2012-04-18 06:59:46
【问题描述】:

我一般使用re.findall(p, text)来匹配一个模式,但现在我遇到了一个问题:

我只想将p 匹配为普通字符串,而不是正则表达式。

例如:p 可能包含 '+' 或 '*',我不希望这些字符具有正则表达式中的特殊含义。换句话说,我希望 p 逐个字符地匹配。

在这种情况下p 对我来说是未知的,所以我不能在其中添加“\”来忽略特殊字符。

【问题讨论】:

  • 如果你不知道p,你怎么能把它当成正则表达式呢?
  • @Marcin:他没有关于p 的先验信息,因此他无法对已经转义的字符串进行硬编码。不明白为什么这被否决了?
  • @NiklasB。好吧,也许吧,但是如果他有字符串,为什么他不能转义特殊字符?
  • @Marcin:我认为如何做到这一点是这里的实际问题。 “我不能在其中添加'\'以忽略特殊字符”可能是指手动转义。

标签: python regex string


【解决方案1】:

你可以使用re.escape:

>>> p = 'foo+*bar'
>>> import re
>>> re.escape(p)
'foo\\+\\*bar'

或者只是使用字符串操作来检查p是否在另一个字符串中:

>>> p in 'blablafoo+*bar123'
True
>>> 'foo+*bar foo+*bar'.count(p)
2

顺便说一句,如果您想将p 嵌入到适当的正则表达式中,这主要是有用的:

>>> re.match(r'\d.*{}.*\d'.format(re.escape(p)), '1 foo+*bar 2')
<_sre.SRE_Match object at 0x7f11e83a31d0>

【讨论】:

  • 我想用re.findall(),所以我觉得re.escape()最适合我! :)
  • @ZhuShengqi:要逐字搜索字符串,re.findall()本质上是没用的; res.findall("ab", "abcabcabc") 结果为 ["ab", "ab", "ab"]。你可能想要str.count()
  • @Zhu:是的,如果你不需要正则表达式,就不要使用它们。转义可能有用的情况是 (a) 您希望将 p 集成到更复杂的正则表达式中 (b) 您希望匹配正则表达式列表,其中一些只是纯文本搜索,而另一些则更复杂。
【解决方案2】:

如果您不需要正则表达式,而只想测试模式是否是字符串的子字符串,请使用:

if pattern in string:

如果要在字符串的开头或结尾进行测试:

if string.startswith(pattern): # or .endswith(pattern)

有关其他字符串方法,请参阅文档的 string methods 部分。

如果您需要知道字符串中子字符串的所有位置,请使用str.find

offsets = []
offset = string.find(pattern, 0)
while offset != -1:
    offsets.append(offset)
    # start from after the location of the previous match
    offset = string.find(pattern, offset + 1)

【讨论】:

    【解决方案3】:

    您可以在字符串上使用.find。这将返回“needle”字符串第一次出现的索引(如果未找到,则返回 -1)。例如

    >>> a = 'test string 1+2*3'
    >>> a.find('str')
    5
    >>> a.find('not there')
    -1
    >>> a.find('1+2*')
    12
    

    【讨论】:

      猜你喜欢
      • 2015-12-27
      • 1970-01-01
      • 2013-12-28
      • 2014-12-13
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多