【问题标题】:How to automatically find pattern like 'c++' in string using python re module?如何使用python re模块在字符串中自动查找'c++'之类的模式?
【发布时间】:2013-12-08 07:38:25
【问题描述】:

现在我有一个模式列表:

patterns = ['php', 'java', 'c++']

我想在另一个字符串中匹配它,比如 r'c++ Primer'。 我想用python re模块来做,但问题是,如果我用:

for pattern in patterns:
    re.findall(pattern, r'php php java java c++ c++')

我会得到一个错误,因为'+'在正则表达式中有特殊含义。

那么在这种情况下我该如何解决c++c* 之类的问题?

请注意,我有很多要匹配的模式,所以我不想手动将 c++ 之类的所有内容转换为 c\+\+

感谢您的关注。

【问题讨论】:

  • 对问题进行了编辑,澄清了\+\+ 不是提问者想要的。但是您应该使用“c++”进行 Ctrl+H 搜索并替换为“c\+\+”。
  • 对不起,Ctrl+H 搜索是什么意思?
  • @Warbean 他的意思是,在编辑器中搜索和替换。
  • 具有相关权力的人可以接受我对问题的编辑吗?他的意思是他不想改成“c\+\+”。
  • 根据您的操作,常规字符串方法可能就足够了,因此不必担心生成有效的正则表达式模式,例如:for p in patterns: print "php php java java c++ c++".count(p) 将显示字符串出现的次数,或 for p in patterns: print p in "php php java ..."将显示字符串是否包含模式

标签: python regex escaping


【解决方案1】:

使用字符类。在字符类 +special meaning 之外,因此它不会按原样工作,您需要先对其进行转义:r'c\+\+'

>>> import re
>>> re.findall(r'[+]{2}', r'c++ primer') 
['++']

更新 1:

如果您已经预定义了正则表达式,那么在这些模式上使用 re.escape

>>> patterns = ['php', 'java', 'c++']
>>> for pattern in patterns:
        print re.findall(re.escape(pattern), r'php php java java c++ c++')
...     
['php', 'php']
['java', 'java']
['c++', 'c++']

更新 2:

>>> to_be_escaped = ('c++',)  #patterns that need to be escaped
>>> new_patterns = [re.escape(p) if p in to_be_escaped else p for p in patterns]
>>> for pattern in new_patterns:
        print re.findall(pattern, r'php php java java c++ c++ .net')
...     
['php', 'php']
['java', 'java']
['c++', 'c++']
['.net']

【讨论】:

  • 对不起,这不是我的情况。我已经编辑了我的问题以使自己理解。你能复习一下以帮助我吗?谢谢。
  • 这就是我想要的!非常感谢!
  • 对不起,我有一个新问题。我只想转换'c++',而不是'.net'之类的东西,因为'.'在正则表达式中并不特别。但是 re.escape 也会将 '.net' 转换为 '\.net'。我可以选择哪些逃跑,哪些不逃跑?非常感谢!
  • 感谢您的更新!我只是通过 new_pattern = re.sub(r'\+', r'\+', pattern) 来解决它。我认为这更笼统。希望您可以将其添加到您的帖子中,以便其他人可以看到它。 ^_^
【解决方案2】:

像这样用\ 转义+

pattern = r'c\+\+'
import re
print re.findall(pattern, r'c++ primer')

输出

['c++']

编辑:

import re
patterns = ['php', 'java', 'c\+\+']
for pattern in patterns:
    print re.findall(pattern, r'php php java java c++ c++')

输出

['php', 'php']
['java', 'java']
['c++', 'c++']

【讨论】:

  • 对不起,这不是我的情况。我已经编辑了我的问题以使自己理解,请您查看它以帮助我吗?谢谢。
  • @Warbean 把patterns改成这样patterns = ['php', 'java', 'c\+\+']
  • 可以解决我的问题。 @Ashwini Chaudhary 已经解决了。谢谢大家。^_^
  • @Warbean 你的意思是说我展示的样本不起作用?
  • 不是那个意思。我只是不想手动将“c++”转换为“c\+\+”,因为我现在手头有一个类似“c++”的列表,我想要的只是自动转换。所以 re.escape('c++') 帮帮我。
猜你喜欢
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多