1

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

>>> 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:

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

即使我使用“+”表示一次出现,它也可以工作,但同样,这对 str2 不起作用:

>>> 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 也捕获失败:

>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP)?.*\s+(\d+)S-LC', str1, re.I|re.M).group(3) 
>>>
4

4 回答 4

2

我对这个问题的解释是,OP 想要一个匹配两个字符串的正则表达式,如果它存在,则返回 .group(1) 中的数字(就像它在 str1 中所做的那样)。我认为问题在于他/她无法同时捕获 str1 中的“6”并匹配 str2。

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

>>> 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.

不同之处在于我用 .* “或”非捕获括号

不幸的是,这使得正则表达式更加难以理解,但也许它对你有用。

(为完整性而编辑)

于 2012-04-15T05:54:52.970 回答
1

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

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

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']]
于 2012-04-15T06:52:11.930 回答
1

我不确定您的具体要求是什么。

是这样的吗:

>>> str1 = "hello 12 world"
>>> str2 =  "hello world"
>>> obj = re.search(r'(\d+)',str1)
>>> obj.group(0)
'12'

现在检查str2其中不包含任何十进制值。

>>> obj = re.search(r'(\d+)',str2)
>>> if obj is not None:
...     print obj.group(0)
... else:
...     print "not found"
...
not found
>>>
于 2012-04-15T04:51:31.620 回答
0

我认为问题在于它.*正在吃掉 QSFP 位,并且因为?它没有动力回溯。将其更改.*为非贪婪.*?(令人惊讶 - 至少对我而言)没有帮助。但是,移动.*非捕获组内部确实有帮助:

>>> re.match(r'^4\s+48\s+(?:.*(\d+)\s+QSFP)?.*-LC', str1, re.I|re.M).group(1)
'6'
>>> re.match(r'^4\s+48\s+(?:.*(\d+)\s+QSFP)?.*-LC', str2, re.I|re.M).group(1)
>>> 
于 2012-04-15T06:10:41.590 回答