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]不是一个单独的词!