如何编写python表达式来过滤掉某些字符串

时间:2016-11-28 01:37:44

标签: python regex

有一个包含多个数字的字符串,例如:

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"

我知道这是一个没有正则表达式的微不足道的问题,我只想用正则表达式解决这个问题。但我真的无法弄清楚如何用正则表达式解决这个问题。有人可以帮帮我吗?

4 个答案:

答案 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']

RegEx Demo

    当前一个char为DOT时,
  • (?<!\.)是断言的断言。
  • 当下一个字符是DOT时,
  • (?!\.)是断言预告失败。
  • \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']
  • patten匹配(?<=\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