Python中re.findall使用变量时,变量内容中的“\b”不起作用怎么办?

import re
def find():
txt = ‘Hi, I am Shirley Hilton. I am his wife.’
w=re.findall(r’%s’% x,txt)
if w:
print(w)
else:
print(‘not match’)

x=‘hi’
find()
x=‘Hi’
find()
x=’\bhi\b’
find()

输出结果:
前面 2 个正常,后面这个 x=’\bhi\b’就不对了。
Python中re.findall使用变量时,变量内容中的“\b”不起作用怎么办?


4 回复

这样改就可以了:
import re
def find():
txt = ’ hi , I am Shirley Hilton. I am his wife.’
w=re.findall(’%s’ % x,txt)
if w:
print(w)
else:
print(‘not match’)

x=‘hi’
find()
x=‘Hi’
find()
x=r’\bhi\b’
find()


这个问题是因为字符串转义和正则表达式转义冲突了。\b在Python字符串里是退格符,传到正则引擎时已经不是单词边界了。

两种解决方案:

方案1:使用原始字符串(推荐)

import re

pattern = r'\b' + re.escape(variable) + r'\b'
result = re.findall(pattern, text)

方案2:双反斜杠转义

import re

pattern = '\\b' + re.escape(variable) + '\\b'
result = re.findall(pattern, text)

关键点:

  1. r''原始字符串避免转义问题
  2. re.escape()对变量内容进行安全转义
  3. 单词边界\b要放在变量外面

比如找"word"这个词:

text = "hello world word test"
variable = "word"
pattern = r'\b' + re.escape(variable) + r'\b'
# 实际pattern是:\bword\b
print(re.findall(pattern, text))  # ['word']

这样就能正确匹配整个单词了。

总结:用原始字符串加re.escape处理变量。

真心看不下去了。
求求楼主,能把
w=re.findall(r’%s’% x,txt)
改成
w=re.findall(repr(x), txt)
么?

还有就是把 x 当参数传进来,弄成全局变量太恶心了。

谢谢!可以了。

你这个方法不行啊。我是新手在看教学,只会这个办法。
教学里面是固定内容,比如:re.findall(r"hi", text)
感觉那样太死板,所以自己改成变量。

回到顶部