有一个包含多个数字的字符串,例如:
12.03 5.897 7.10.74 0.103 12.05 6.4.1 8.98
我想使用 Python正则表达式仅输出只有single dot (.)
的数字,例如"12.03"
和"5.897"
,而不是"7.10.74"
和"6.4.1"
。
我知道这是一个没有正则表达式的微不足道的问题,我只想用正则表达式解决这个问题。但我真的无法弄清楚如何用正则表达式解决这个问题。有人可以帮帮我吗?
答案 0 :(得分:7)
如果你想要一个纯正则表达式解决方案,那么使用lookarounds:
>>> s = "12.03 5.897 7.10.74 0.103 12.05 6.4.1 8.98"
>>> print re.findall(r'(?<!\.)\b\d+\.\d+\b(?!\.)', s)
['12.03', '5.897', '0.103', '12.05', '8.98']
(?<!\.)
是断言的断言。(?!\.)
是断言预告失败。\b
是双边必需的字边界,以确保我们匹配完整的十进制数答案 1 :(得分:2)
正则表达式解决方案:
首先使用以下方法将字符串拆分为列表:
然后使用re
lib来使用正则表达式
s = "12.03 5.897 7.10.74 0.103 12.05 6.4.1 8.98";
sList= s.split();
#d+ strats with one or more digits follwd by a .(dot) ends with one or more digits;
r = re.compile('^\d+\.\d+$');
filter(r.match, sList);
如果你想要纯正则表达式解决方案,试试这个:(注意未经测试)
myMatch = tuple(re.finditer(r"(\d+\.\d+)\s|$", s))
for str in myMatch :
print str.group()
编辑根据@erip
评论,如果您的字符串中包含值,则可以将[-+]?
添加到正则表达式[-+]?(\d+\.\d+)\s|$
。
答案 2 :(得分:2)
使用(?<=\s)\d*\.\d*(?=\s|$)|^\d*\.\d*(?=\s|$)
:
import re
re.findall(r'(?<=\s)\d*\.\d*(?=\s|$)|^\d*\.\d*(?=\s|$)', s)
# ['12.03', '5.897', '0.103', '12.05', '8.98']
(?<=\s)\d*\.\d*(?=\s|$)
或^\d*\.\d*(?=\s|$)
,具体取决于该数字是否位于字符串的开头; \d*\.\d*(?=\s|$)
匹配带有一个点后跟空格或字符串结尾的数字; 注意:无法使用(?<=\s|^)
来集成这两种情况,因为后置语法不支持;
答案 3 :(得分:0)
string = "12.03 5.897 7.10.74 0.103 12.05 6.4.1 8.98"
r = re.compile('^\d+\.\d+$')
res = filter(r.match, string.split(' '))
print res