python

时间:2016-04-08 16:42:29

标签: python regex

我有以下字符串

WA2ąą-02 -7+12,7. PP-.5P x0.6 words

我需要使用正则表达式计算所有数字的wordsnumbersum

单词:

WA2ąą-02
-7+12,7. 
PP-.5P
x0.6
words

编号:

2
-2
-7
12
7
-0.5
0.6

数字总和应为12.1

我写了这段代码,只有字数很好用:

import re

string = "WA2ąą-02 -7+12.7. PP-.5P x0.6    word"

#regular expresions
regex1 = r'\S+'
regex2 = r'-?\b\d+(?:[,\.]\d*)?\b'

count_words = len(re.findall(regex1, string))
count_numbers = len(re.findall(regex2, string))
sum_numbers = sum([float(i) for i in re.findall(regex2, string)])

print("\n")
print("String:", string)
print("\n")
print("Count words:", count_words)
print("Count numbers:", count_numbers)
print("Sum numbers:", sum_numbers)
print("\n")
input("Press enter to exit")

输出:

Count words: 5
Count numbers: 4
Sum numbers: 9.7

2 个答案:

答案 0 :(得分:2)

我认为你的regex1很好,很简单。

regex2 = r'[-+]?\d*\.?\d+'

似乎可以做到这一点(但很容易错过正则表达式的边缘情况)。可选-或'+',后跟任意数量的数字,后跟可选的.,然后匹配至少一位数字。

Regex101 Demo

答案 1 :(得分:1)

以下正则表达式似乎工作正常

([-+]?[\.]?(?=\d)(?:\d*)(?:\.\d+)?)

Python代码

p = re.compile(r'([-+]?[\.]?(?=\d)(?:\d*)(?:\.\d+)?)')
test_str = u"WA2ąą-02 -7+12,7. PP-.5P x0.6 words"
print(sum([float(x) for x in re.findall(p, test_str)]))

<强> Ideone Demo

更新HEX

以下正则表达式似乎有效(假设hex数字在字符串中没有小数)

([-+]?)(?:0?x)([0-9A-Fa-f]+)

Python代码

p = re.compile(r'([-+]?)(?:0?x)([0-9A-Fa-f]+)')
test_str = u"WA2ąą-02 -7+12,7. -0x1AEfPq PP-.5P 0x1AEf +0x1AEf x0.6 words"

for x in re.findall(p, test_str):
    tmp = x[0] + x[1]
    print(int(tmp, 16))

<强> Ideone Demo

如果有任何问题,请随时发表评论