搜索模式包括方括号

时间:2015-07-21 06:59:25

标签: python regex string-search

我正在尝试搜索文件中的确切字词。我按行读取文件并循环遍历这些行来查找确切的单词。由于<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')

有人可以帮我调整正则表达式吗?

3 个答案:

答案 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

相关问题