任何人都可以帮我解决以下问题吗?
NFL赛季即将来临,我正在制作一个python脚本,以便从网站上搜集分散的内容。
场景一:点差以-3 + 3
的形式出现场景二:点差以-3.5 + 3.5
的形式出现import re
s1 = '-3+3'
s2 = '-3.5+3.5'
search1 = re.search(r'(.\d)(.*)',s1)
search2 = re.search(r'(.\d)(.*)',s2)
print search1.group(1),','search1.group(2)
print search2.group(1),',',search2.group(2)
>-3 , +3
>-3 , .5+3.5
正如您所看到的,第二个场景的输出会删除小数点后面的任何内容并将其放在下一个数字的前面。任何人都可以帮我找到适用于这两种情况的解决方案吗?
谢谢!
答案 0 :(得分:3)
您可以将re.findall()
与'(.\d(?:\.\d+)?)'
一起用作正则表达式,它使用可选组来匹配小数部分:
>>> re.findall(r'(.\d+(?:\.\d+)?)', s1)
['-3', '+3']
>>> re.findall(r'(.\d+(?:\.\d+)?)', s2)
['-3.5', '+3.5']
答案 1 :(得分:2)
正如我在评论中所说,这个正则表达式会抓取任意数字对,可选地前面加+/-,带小数或不带小数。
([-+]?\d+(?:\.\d+)?)([-+]?\d+(?:\.\d+)?)
此外,如果您要多次使用相同的正则表达式(特别是如果您将使用它几十次或更多次),您应该在使用前编译它:
import re
pattern = re.compile(r'([-+]?\d+(?:\.\d+)?)([-+]?\d+(?:\.\d+)?)')
s1 = '-3+3'
s2 = '-3.5+3.5'
search1 = pattern.search(s1)
search2 = pattern.search(s2)
print search1.group(1), "," , search1.group(2)
与匹配原始字符串模式相比,这可能会提高数十倍的性能。
答案 2 :(得分:0)
以下是一个使用多位数字的示例:
import re
NUMBERS_RE = '[\-\+]\d*\.?\d+'
s1 = '-3+3'
s2 = '-3.5+3.5-12.56+300.9998-.2+5'
print re.findall(NUMBERS_RE, s1)
print re.findall(NUMBERS_RE, s2)
输出:
['-3', '+3']
['-3.5', '+3.5', '-12.56', '+300.9998', '-.2', '+5']