[英]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.