在正则表达式中匹配字符串中的数字并转换为整数[重复]
Posted
技术标签:
【中文标题】在正则表达式中匹配字符串中的数字并转换为整数[重复]【英文标题】:Matching numbers in strings in regex and converting into integers [duplicate] 【发布时间】:2018-09-04 23:31:16 【问题描述】:我正在尝试使用 re.findall() 匹配给定文本正文中的所有数字并将它们转换为整数。我知道[0-9]+
或[\d]+
之类的东西应该匹配字符串中的任何数字,但是,我的输出会单独拆分数字(例如,'125' 变为'1'、'2'、'5'。
这是我所拥有的:
import re
regex_list = []
sample = "Here are a bunch of numbers 7746 and 12 and 1929 and 8827 and 7 and 8837 and 128 now convert them"
for line in sample:
line = line.strip()
if re.findall('([0-9]+)', line):
regex_list.append(int(line))
print(regex_list)
输出:
[7, 7, 4, 6, 1, 2, 1, 9, 2, 9, 8, 8, 2, 7, 7, 8, 8, 3, 7, 1, 2, 8]
期望的输出:
[7746, 12, 1929, 8827, 7, 8837, 128]
【问题讨论】:
问题不在于正则表达式,问题在于您的for
循环。看看line
的值...(顺便说一句,这应该是调试此问题的首要任务之一。)
好的,感谢您的澄清,我不知道使用 for 循环会产生这种效果
【参考方案1】:
for line in sample
将单个字符存储在 line
中,直到您的 sample
是行列表
【讨论】:
【参考方案2】:查看@chrisz's answer 以获得更好的解决方案。
但是,如果你想知道你的问题是什么:
使用for
循环遍历字符串会得到单个字符,而不是你想象的单词。要获取单词,您必须使用split()
。
regex_list = []
sample = "Here are a bunch of numbers 7746 and 12 and 1929 and 8827 and 7 and 8837 and 128 now convert them"
for line in sample.split():
line = line.strip()
if re.findall('([0-9]+)', line):
regex_list.append(int(line))
print(regex_list)
# [7746, 12, 1929, 8827, 7, 8837, 128]
但是,由于您是单独获取单词,因此无需使用正则表达式。您可以直接联系我们isdigit()
。
for line in sample.split():
line = line.strip()
if line.isdigit():
regex_list.append(int(line))
或者,简单地使用列表推导:
num_list = [int(word) for word in sample.split() if word.isdigit()]
print(num_list)
# [7746, 12, 1929, 8827, 7, 8837, 128]
【讨论】:
【参考方案3】:您的问题是您当前正在逐个字符地循环,而您实际上可以将正则表达式应用于整行。
>>> import re
>>> s = "Here are a bunch of numbers 7746 and 12 and 1929 and 8827 and 7 and 8837 and 128 now convert them"
>>> [int(j) for j in re.findall(r'[0-9]+', s)]
[7746, 12, 1929, 8827, 7, 8837, 128]
【讨论】:
以上是关于在正则表达式中匹配字符串中的数字并转换为整数[重复]的主要内容,如果未能解决你的问题,请参考以下文章