Python 搜索模式包括方括号

Python 搜索模式包括方括号,python,regex,string-search,Python,Regex,String Search,我试图在文件中搜索精确的单词。我一行一行地阅读文件,并在每行中循环查找确切的单词。由于关键字中的不适合查找精确的单词,因此我使用了正则表达式模式 def findWord(w): return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search 此函数的问题是is无法识别方括号[xyz] 比如说 findWord('data_var_cod[0]')('Cod_Byte1 = DATA_VAR_COD[0]')

我试图在文件中搜索精确的单词。我一行一行地阅读文件,并在每行中循环查找确切的单词。由于关键字中的
不适合查找精确的单词,因此我使用了正则表达式模式

def findWord(w):
    return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search
此函数的问题是is无法识别方括号
[xyz]

比如说

findWord('data_var_cod[0]')('Cod_Byte1 = DATA_VAR_COD[0]') 
返回
None

findWord('data_var_cod')('Cod_Byte1 = DATA_VAR_COD') 
返回


谁能帮我调整一下regex模式吗?

那是因为
[
]
有特殊的意义。您应该引用您要查找的字符串:

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\]

这是因为正则表达式引擎假设方括号是字符类,它们是正则表达式字符,为了解决这个问题,您需要转义正则表达式字符。您可以使用
re.escape
功能:

def findWord(w):
    return re.compile(r'\b({0})\b'.format(re.escape(w)), flags=re.IGNORECASE).search
另外,作为获取所有匹配项的一种更具python风格的方法,您可以使用它返回匹配项列表,或者使用
re.finditer
返回包含匹配对象的迭代器

但这种方法仍然不完整和有效,因为 使用单词边界时,内部单词必须包含一种类型的字符

>>> 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]'
因此,如果您的单词不包含单词字符,我建议删除单词边界

>>> 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]'
但作为一种更通用的方法,您可以使用以下正则表达式,这些正则表达式使用以空格环绕或位于字符串末尾或前导的匹配词:

r'(?: |^)({})(?=[. ]|$) '
您需要一种“智能”的方式来构建正则表达式:

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)
我们可以检查关键字是否以单词字符结尾


如果您有多个关键字要检查字符串,您可以检查。

您希望它返回什么?Hello对于:findWord('data_var_cod[0]')('cod_Byte1=data_var_cod[0]')Hello对于:findWord('data_var_cod[0]')('cod Byte1=data_var_cod[0]'))@bitsnighi;)你删除了单词边界吗?是的,删除边界后它会工作!非常感谢:)@BitsNPieces欢迎!嗨,移除边界后出现了一个小问题。现在它匹配字符序列,而不是精确的单词。例如,它为findWord('data_var_cod[0]')('cod_Byte1=data_var_cod[0]')返回true,其中预期行为应返回None,因为data_var_cod[0]不是一个单独的词!