使用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不重复 - 它已包含该帖子中最适用的解决方案。
答案 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)
另一个解决方案是“动态地”翻译对象或将其转义。