使用re.findall()匹配包含特殊字符的术语?

时间:2015-05-14 16:42:09

标签: python regex

使用re.findall(),我试图通过字符串中的术语列表查找每个术语的所有匹配项。

如果特定术语包含特殊字符(即a '+'),则无法找到匹配项,或者可能生成错误消息。使用re.escape(),可以避免出现错误消息,但在字符串中找不到带有特殊字符的术语。

import re         
my_list = ['java', 'c++', 'c#', '.net']
my_string = ' python javascript c++ c++ c# .net java .net'
matches = []

for term in my_list:
    if any(x in term for x in ['+', '#', '.']):
        term = re.escape(term)

    print "\nlooking for term '%s'" % term 
    match = re.findall("\\b" + term + "\\b", my_string, flags = re.IGNORECASE)
    matches.append(match)

以上代码只会找到' java'在字符串中。 有关如何在字符串中查找带有特殊字符的术语的任何建议吗?

警告:我无法更改“my_list'手动,因为我事先并不知道它将包含哪些条款。

更新 - 问题似乎与正则表达式中的单词边界说明符有关(" \ b")沿着包含非字符的字符分解字符串 - 字符串中包含的字母数字字符。但是,目前还不清楚如何以干净和直接的方式解决这个问题。

修改 - 此问题与this不重复 - 它已包含该帖子中最适用的解决方案。

2 个答案:

答案 0 :(得分:1)

import re
my_list = ['java', 'c++', 'c#', '.net']
my_string = ' python javascript c++ c++ c# .net java .net'
matches = []

for term in my_list:
    if any(x in term for x in ['+', '#', '.']):
        term = re.escape(term)

    print "\nlooking for term '%s'" % term
    match = re.findall(r"(?:^|(?<=\s))"+term+r"(?=\s|$)", my_string, flags = re.IGNORECASE)
    matches.append(match)

试试这个。问题是\b这是单词边界。在C++ +之后没有单词边界。所以它不匹配。类似于其他人。

答案 1 :(得分:0)

检查python的regex syntax

  • + - regexp中使用的是特殊字符,必须通过\转义
  

'+' - 使得到的RE匹配1次或多次重复   在RE之前。 ab +将匹配'a',后跟任何非零数字   “B的;它不会只匹配'a'。

    在这种情况下,
  • 用于匹配正则表达式字符串中不止一次出现的任何内容。

例如,这将以字符串形式提取整个数字序列:

re.findall('[0-9]+', 'This 0123435124 is a string with numbers')

这会显示0123435124,而这只会为您检索0

re.findall('[0-9]', 'This 0123435124 is a string with numbers')

解决问题的最快方法

my_list = ['java', 'c\+\+', 'c#', '\.net']
for key in my_list:
    match = re.findall("\\b" + key + "\\b", my_string, flags = re.IGNORECASE)

另一个解决方案是“动态地”翻译对象或将其转义。