Python3 中正则表达式 'ver="(.*?)"' 如何像 grep -o -E 一样只返回括号内匹配的数据?

()表示只匹配括号里的
.? 任意字符,非贪婪模式
grep -o 只返回匹配的
grep -E 扩展正则
数据都是
fjiojfiawejfoijf ver=“226800"fjiajfioafjio
Python 3 正则要只返回 226800,如下代码返回了 ver=“226800”

pattern = re.compile( 'ver=”(.
?)"’)
string = ‘fjiojfiawejfoijf ver="226800"fjiajfioafjio’
print(re.search(pattern, string).group())

不知错在哪里,多谢指点。。
Python3 中正则表达式 ‘ver="(.*?)"’ 如何像 grep -o -E 一样只返回括号内匹配的数据?


12 回复

groups()


import re

# 原始字符串
text = 'ver="1.2.3" and ver="4.5.6"'

# 使用findall直接获取括号内的内容
matches = re.findall(r'ver="(.*?)"', text)
print(matches)  # 输出: ['1.2.3', '4.5.6']

# 或者使用finditer逐个获取
for match in re.finditer(r'ver="(.*?)"', text):
    print(match.group(1))  # 输出: 1.2.3 然后 4.5.6

关键点:

  1. re.findall() 当正则中有捕获组时,只返回组内内容
  2. .*? 是非贪婪匹配,匹配到第一个 " 就停止
  3. 这完全对应 grep -o -E 'ver="([^"]*)"' 的效果

要像grep一样只返回括号里的内容,直接用findall就行。

或 group(0)

In [53]: astring = ‘fjiojfiawejfoijf ver="226800"fjiajfioafjio’

In [54]: re.search(’(?<=ver=").*?(?=")’, astring).group()
Out[54]: ‘226800’

pattern.search(string).group(1)

全部匹配: group(0)
括号中的匹配:group(1)

相当于 perl 中的$0 $1
:p

楼上的真是好脾气。遇到这种问题应该先甩一个 docs.python.org 的链接,精确到函数。

https://docs.python.org/3/library/re.html#re.match.group

Python 不需要用 compile
result = re.search(‘ver="(.*?)"’, string).group(1)

我就喜欢用 findall

用 python 应该熟读 python 文档,group 可破。
用正则应该熟读正则文档,(?<=exp)可破。

提问建议使用“ xxx 如何 yyy ”比较安全,而不是“ xxx 不能 yyy 吗?”,会激怒一大堆簇拥者。
对于一门尚未掌握的技术,起码保持一点敬畏吧。。。

赞一个, 楼上的太好脾气了

回到顶部