繁体   English   中英

将第一个括号与Python匹配

[英]Match first parenthesis with Python

从诸如

70849   mozilla/5.0(linux;u;android4.2.1;zh-cn)applewebkit/534.30(khtml,likegecko)version/4.0mobilesafari/534.30

我想获取第一个带括号的内容linux;u;android4.2.1;zh-cn

我的代码如下所示:

s=r'70849   mozilla/5.0(linux;u;android4.2.1;zh-cn)applewebkit/534.30(khtml,likegecko)version/4.0mobilesafari/534.30'
re.search("(\d+)\s.+\((\S+)\)", s).group(2)

但是结果是最后一个括号的内容khtml,likegecko

如何解决呢?

您遇到的主要问题是贪婪点匹配.+模式 它捕获您拥有的整个字符串,然后回溯,一次从右侧产生一个字符,尝试适应后续的模式。 因此,它与最后的括号匹配。

您可以使用

^(\d+)\s[^(]+\(([^()]+)\)

参见regex演示 在这里, [^(]+将匹配限制为除(以外的所有字符)(因此,它无法捕获整行直到结尾)并获得第一对括号。

模式说明:

  • ^ -字符串开头( 注意 :如果数字不在字符串开头,请删除此^锚)
  • (\\d+) -第1组:1个或多个数字
  • \\s空格(如果不是必需字符,则可以将其删除,因为后续的否定字符类将与空格匹配)
  • [^(]+ - 1+字符以外(
  • \\( -文字(
  • ([^()]+) -组2匹配除()以外的1+个字符
  • \\) -关闭)

正则表达式可视化

Debuggex演示

这是IDEONE演示

import re
p = re.compile(r'^(\d+)\s[^(]+\(([^()]+)\)')
test_str = "70849   mozilla/5.0(linux;u;android4.2.1;zh-cn)applewebkit/534.30(khtml,likegecko)version/4.0mobilesafari/534.30"
print(p.findall(test_str))
# or using re.search if the number is not at the beginning of the string
m = re.search(r'(\d+)\s[^(]+\(([^()]+)\)', test_str)
if m:
    print("Number: {0}\nString: {1}".format(m.group(1), m.group(2)))
# [('70849', 'linux;u;android4.2.1;zh-cn')]
# Number: 70849
# String: linux;u;android4.2.1;zh-cn

您可以使用否定的类\\(([^)]*)\\)来匹配()之间的任何内容:

>>> s=r'70849  mozilla/5.0(linux;u;android4.2.1;zh-cn)applewebkit/534.30(khtml,likegecko)version/4.0mobilesafari/534.30'

>>> m = re.search(r"(\d+)[^(]*\(([^)]*)\)", s)
>>> print m.group(1)
70849
>>> print m.group(2)
linux;u;android4.2.1;zh-cn

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM