我正在尝试搜索文件中的确切字词。我按行读取文件并循环遍历这些行来查找确切的单词。由于<dropdown>
关键字不适合查找确切的字词,因此我使用的是正则表达式模式。
in
此功能的问题在于无法识别方括号def findWord(w):
return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search
。
例如
[xyz]
返回findWord('data_var_cod[0]')('Cod_Byte1 = DATA_VAR_COD[0]')
而
None
返回findWord('data_var_cod')('Cod_Byte1 = DATA_VAR_COD')
有人可以帮我调整正则表达式吗?
答案 0 :(得分:1)
因为[
和]
具有特殊含义。你应该引用你正在寻找的字符串:
re.escape(regex)
将为你逃脱正则表达式。将您的代码更改为:
return re.compile(r'\b({0})\b'.format(re.escape(w)), flags=re.IGNORECASE).search
↑↑↑↑↑↑↑↑↑
您可以看到re.quote
对字符串的作用,例如:
>>> w = '[xyz]'
>>> print re.escape(w)
\[xyz\]
答案 1 :(得分:1)
这是因为正则表达式引擎假设方括号作为字符类,这是正则字符,因此你需要逃避你的正则表达式字符。您可以使用re.escape
功能:
def findWord(w):
return re.compile(r'\b({0})\b'.format(re.escape(w)), flags=re.IGNORECASE).search
此外,作为获取所有匹配项的更加pythonic方式,您可以使用re.fildall()
返回匹配列表或re.finditer
返回包含matchobjects的迭代器。
但是这种方式仍然不完整和有效,因为 当您使用单词边界时,您的内部单词必须包含一个类型字符。
>>> ss = 'hello string [processing] in python.'
>>>re.compile(r'\b({0})\b'.format(re.escape('[processing]')),flags=re.IGNORECASE).search(ss)
>>>
>>>re.compile(r'({})'.format(re.escape('[processing]')),flags=re.IGNORECASE).search(ss).group(0)
'[processing]'
因此,如果您的单词不包含单词字符,我建议删除单词边界。
但是作为一种更通用的方式,您可以使用以下正则表达式,使用positive look around匹配按空格包围的单词或者来自字符串或结尾的单词:
r'(?: |^)({})(?=[. ]|$) '
答案 2 :(得分:0)
你需要一种“聪明”的方式来构建正则表达式:
def findWord(w):
if re.match(r'\w', w) and re.search(r'\w$', w):
return re.compile(r'\b{0}\b'.format(w), flags=re.IGNORECASE).search
if not re.match(r'\w', w) and not re.search(r'\w$', w):
return re.compile(r'{0}'.format(w), flags=re.IGNORECASE).search
if not re.match(r'\w', w) and re.search(r'\w$', w):
return re.compile(r'{0}\b'.format(w), flags=re.IGNORECASE).search
if re.match(r'\w', w) and not re.search(r'\w$', w):
return re.compile(r'\b{0}'.format(w), flags=re.IGNORECASE).search
问题在于,您的某些关键字在开始时只会包含单词字符,其他关键字 - 仅在结尾处,大多数都会在两端都包含单词字符,而某些关键字将包含非单词字符。要有效地检查单词边界,您需要知道关键字的开头/结尾是否有单词字符。
因此,使用re.match(r'\w', x)
,我们可以检查关键字是否以单词字符开头,如果是,则将\b
添加到模式中,使用re.search(r'\w$', x)
我们可以检查是否关键字以单词字符结尾。
如果您有多个关键字来检查字符串,可以查看this post of mine。