首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用*或捕获字符串?使用python正则表达式中的组

如何使用*或捕获字符串?使用python正则表达式中的组
EN

Stack Overflow用户
提问于 2012-04-15 12:35:23
回答 4查看 733关注 0票数 1

我有下面的str1和str2,我想只使用一个正则表达式,它将匹配这两个。在str1的情况下,我还希望能够捕获QSFP端口的数量

代码语言:javascript
复制
>>> str1='''4 48 48-port and 6 QSFP 10GigE Linecard 7548S-LC''' 
>>> str2='''4 48 48-port 10GigE Linecard 7548S-LC''' 
>>> 

我希望能够捕获数字"4“、"48”、"6“(如果存在)和"7548”。但是我无法使用"?“来捕获"6”。元字符。

当我不使用元字符时,捕获适用于str1,但随后我可以使用此正则表达式,因为它不适用于str2:

代码语言:javascript
复制
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP).*\s+(\d+)S-LC', str1, re.I|re.M).group(3) 
'6' 
>>>

即使我使用"+“来表示一次出现,它也可以工作,但同样,这不适用于str2:

代码语言:javascript
复制
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP)+.*\s+(\d+)S-LC', str1, re.I|re.M).group(3) 
'6' 
>>>

当我使用"?“为了匹配0或1次出现,即使对于str1,捕获也会失败:

代码语言:javascript
复制
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP)?.*\s+(\d+)S-LC', str1, re.I|re.M).group(3) 
>>>
EN

回答 4

Stack Overflow用户

发布于 2012-04-15 13:54:53

我对这个问题的解释是,OP需要一个匹配两个字符串的正则表达式,并在.group(1)中返回数字(如果它存在的话)(就像在str1中一样)。我认为问题在于他/她不能既捕获str1中的'6‘,又匹配str2。

我从一些快速的试验和错误中得到了这个:

代码语言:javascript
复制
>>> str1='''4 48 48-port and 6 QSFP 10GigE Linecard 7548S-LC''' 
>>> str2='''4 48 48-port 10GigE Linecard 7548S-LC''' 
>>> re.search(r'^4\s+48\s+.*(?:(\d+)\s+QSFP)|.*-LC', str1, re.I|re.M).group(1)
'6'
>>> re.search(r'^4\s+48\s+.*(?:(\d+)\s+QSFP)|.*-LC', str2, re.I|re.M).group(1)
>>> # no error returned, implying a match was found.

不同之处在于,使用.*时,I“或”非捕获双亲

不幸的是,这使得正则表达式更加难以理解,但它可能会为您工作。

(为完整而编辑)

票数 2
EN

Stack Overflow用户

发布于 2012-04-15 12:51:32

我不太清楚你的要求是什么。

是这样的吗:

代码语言:javascript
复制
>>> str1 = "hello 12 world"
>>> str2 =  "hello world"
>>> obj = re.search(r'(\d+)',str1)
>>> obj.group(0)
'12'

现在签入不包含任何十进制值的str2

代码语言:javascript
复制
>>> obj = re.search(r'(\d+)',str2)
>>> if obj is not None:
...     print obj.group(0)
... else:
...     print "not found"
...
not found
>>>
票数 1
EN

Stack Overflow用户

发布于 2012-04-15 14:52:12

我希望能够捕获数字"4“、"48”、"6“(如果存在)和"7548”。但是我无法使用"?“来捕获"6”。元字符。

如果避免使用正则表达式,您可以简化您的工作,因为您的查询非常简单。

代码语言:javascript
复制
str1='''4 48 48-port and 6 QSFP 10GigE Linecard 7548S-LC'''
str2='''4 48 48-port 10GigE Linecard 7548S-LC'''
lines = [str1,str2]
nums = []
for l in lines:
    r = []
    bits = l.split()
    last_num = bits.pop()[:-4]
    _ = [r.append(i) for i in bits if i.isdigit()]
    r.append(last_num)
    nums.append(r)

>>> nums
[['4', '48', '6', '7548'], ['4', '48', '7548']]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10159537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档