Python中RE匹配失败,和regex101结果困惑

1 投票
2 回答
595 浏览
提问于 2025-04-19 08:47

在这个链接 http://regex101.com/r/oU6eI5/1 上测试的时候,结果看起来没问题,但当我在Python中使用时,却匹配到了整个字符串。

str = galley/files/tew/tewt/tweqt/
re.sub('^.+/+([^/]+/$)', "\1", str) 

我想要得到的是 "tweqt/"。

2 个回答

5

你需要在替换的时候使用原始字符串:

str = galley/files/tew/tewt/tweqt/
re.sub('^.+/+([^/]+/$)', r"\1", str)
#                        ^

否则,你会得到转义字符 \1。比如在我的控制台上,它显示的是一个小笑脸。

如果你不想使用原始字符串,你就得把反斜杠转义:

re.sub('^.+/+([^/]+/$)', "\\1", str)

另外,值得注意的是,使用原始正则表达式字符串和一致的引号是个好习惯,所以我建议你使用:

re.sub(r'^.+/+([^/]+/$)', r'\1', str)

其他注意事项

使用 re.search 来匹配可能会更简单,而不是使用 re.sub

re.search(r'[^/]+/$', str).group()
# => tweqt/

另外,你可能想用其他变量名,而不是 str,因为这样会覆盖掉已有的函数 str()

3

如果你把模式或者正则表达式定义为原始字符串,那会更好。

>>> import re
>>> s = "galley/files/tew/tewt/tweqt/"
>>> m = re.sub(r'^.+/+([^/]+/$)', r'\1', s)
               ^                  ^
>>> m
'tweqt/'

撰写回答