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”不起作用怎么办?
这样改就可以了:
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)
关键点:
- 用
r''原始字符串避免转义问题 - 用
re.escape()对变量内容进行安全转义 - 单词边界
\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)
感觉那样太死板,所以自己改成变量。

