我有一些像下面的数字和字符串。有些人只有数字,有些人还有一些字符串:
'abc' (17245...64590)
'cde' (12244...67730)
'dsa' complement (12345...67890)
我想提取带有和不带数字的两种格式。因此,前两行应仅包含数字,而第三行也应包含数字前的字符串。
我正在使用此命令来实现此目的。
result = re.findall("\bcomplement\b|\d+", line)
任何想法,怎么做。 预期的输出将是这样的:
17245, 64590
12244, 67730
complement, 12345, 67890
答案 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))
提取)。