Python中正则表达式在Atom编辑器中匹配成功,但在PyCharm中运行失败的原因是什么?
我写的正则是: https://.+?(jpg|gif)
然后要匹配的地址是一串如: https:///i.imgur.com/TA3T3gU.gif ; https://i.redd.it/msevs1zayzg11.jpg ; https://i.redd.it/msevs1zayzg11.jpg 。。。
在 Atom 里面试验的时候是可以匹配的。但是 pycharm 里面运行错误,我把匹配的结果打印出来显示是:[‘gif’, ‘jpg’, ‘jpg’, ‘jpg’, ‘jpg’, ‘gif’, ‘jpg’, ‘jpg’…]
也就是只匹配了(jpg|gif)
是什么情况,大家能指点下么?
Python中正则表达式在Atom编辑器中匹配成功,但在PyCharm中运行失败的原因是什么?
我猜你用的是 re.findall()
这个问题通常是因为不同环境下的正则表达式引擎或字符串转义处理方式不同导致的。
最常见的原因是原始字符串(raw string)的使用问题。在Atom编辑器的查找替换中,你输入的正则表达式会被直接解析,而在Python代码中,字符串需要经过Python解释器的转义处理。
看个例子:假设你想匹配反斜杠加数字的模式(如 \1):
import re
# 错误写法 - 在PyCharm中会失败
pattern = '\d+\\.\d+' # 这里 \. 会被Python转义
text = "价格是 123.45 元"
result = re.findall(pattern, text) # 可能匹配失败
# 正确写法 - 使用原始字符串
pattern = r'\d+\.\d+' # r前缀表示原始字符串
text = "价格是 123.45 元"
result = re.findall(pattern, text)
print(result) # 输出: ['123.45']
另一个常见问题是换行符处理:
import re
# 多行文本匹配
text = """第一行
第二行
第三行"""
# 匹配以"第"开头、以"行"结尾的内容
pattern = r'第.*行'
result = re.findall(pattern, text, re.DOTALL) # 需要DOTALL标志来匹配换行
print(result) # 输出: ['第一行\n第二行\n第三行']
建议:在Python正则表达式中始终使用原始字符串(r’pattern’)。
是的。。
( https://.+?(?:jpg|gif))
这样行不?
因为 Python 需要用圆括号括起来你要匹配的部分,参考下面python<br>>>> re.findall(r'( https://.+?(jpg|gif))', '<a target="_blank" href="https:///i.imgur.com/TA3T3gU.gif" rel="nofollow noopener">https:///i.imgur.com/TA3T3gU.gif</a> ; <a target="_blank" href="https://i.redd.it/msevs1zayzg11.jpg" rel="nofollow noopener">https://i.redd.it/msevs1zayzg11.jpg</a> ; <a target="_blank" href="https://i.redd.it/msevs1zayzg11.jpg'" rel="nofollow noopener">https://i.redd.it/msevs1zayzg11.jpg'</a>)<br>[('<a target="_blank" href="https:///i.imgur.com/TA3T3gU.gif'" rel="nofollow noopener">https:///i.imgur.com/TA3T3gU.gif'</a>, 'gif'), ('<a target="_blank" href="https://i.redd.it/msevs1zayzg11.jpg'" rel="nofollow noopener">https://i.redd.it/msevs1zayzg11.jpg'</a>, 'jpg'), ('<a target="_blank" href="https://i.redd.it/msevs1zayzg11.jpg'" rel="nofollow noopener">https://i.redd.it/msevs1zayzg11.jpg'</a>, 'jpg')]<br>
()是正则分组
为啥匹配出来的结果会多 gif 和 jpg 的结果,是因为 findall 的正则有内外两个括号么?
我最近也在学这个 感觉 findall 各种坑 finditer 就是好好的
是的,Python 里的括号是分组,这里有内外两个括号就是匹配出这两个组
我是跟着韦炜那本书学的,讲得太粗糙了
前面那个答案比较好 如果用 findall 的话 就用(?: jpg|gif)

