如何使用Python选择变量正则表达式?

时间:2017-10-05 18:44:47

标签: python regex

我有一些像下面的数字和字符串。有些人只有数字,有些人还有一些字符串:

'abc'            (17245...64590)
'cde'            (12244...67730)
'dsa'            complement (12345...67890)

我想提取带有和不带数字的两种格式。因此,前两行应仅包含数字,而第三行也应包含数字前的字符串。

我正在使用此命令来实现此目的。

result = re.findall("\bcomplement\b|\d+", line)

任何想法,怎么做。 预期的输出将是这样的:

17245, 64590
12244, 67730
complement, 12345, 67890

1 个答案:

答案 0 :(得分:0)

如果括号内的数字块数始终为2,并且用1+点分隔,则使用

re.findall(r'\s{2,}(?:(\w+)\s*)?\((\d+)\.+(\d+)\)', s)

请参阅regex demo。还有sample Python demo

import re
s= ''''abc'            (17245...64590)
'cde'            (12244...67730)
'dsa'            complement (12345...67890)'''
rx = r"\s{2,}(?:(\w+)\s*)?\((\d+)\.+(\d+)\)"
for x in re.findall(rx, s):
    print(", ".join([y for y in x if y]))

<强>详情

  • \s{2,} - 2个或更多空格
  • (?:(\w+)\s*)? - 可选序列:
    • (\w+) - 第1组:一个或多个单词字符
    • \s* - 0+ whitespaces
  • \( - (
  • (\d+) - 第2组:一个或多个数字
  • \.+ - 1个或多个点
  • (\d+) - 第3组:一个或多个数字
  • \) - )字符。

如果括号内的数字块数可能有所不同,您可以使用

import re
s= ''''abc'            (17245...64590)
'cde'            (12244...67730)
'dsa'            complement (12345...67890)'''
for m in re.finditer(r'\s{2,}(?:(\w+)\s*)?\(([\d.]+)\)', s):
    res = []
    if m.group(1):
        res.append(m.group(1))
    res.extend(re.findall(r'\d+', m.group(2)))
    print(", ".join(res))

两个Python代码段输出:

17245, 64590
12244, 67730
complement, 12345, 67890

请参阅online Python demo。请注意,它可以匹配括号内的任意数量的数字块,并假设列1和列2之间至少有2个空格字符。

也请参阅regex demo。与第一组的区别在于没有第三组,第二组和第三组被一个第二组([\d.]+)替换,后者捕获1个或多个点或数字(这些数字后来用re.findall(r'\d+', m.group(2))提取)。