到目前为止,我们已经有了这个
re.findall(r'[+-](?!\d)|(?<!\d)[.]|[^\+\-.\d\w\s]+',str)
但不会在数字之间取点,而@.%
会将每个数字作为一个单词而不是一个单词。
第一个示例问题:15.2.2.2.2.2.
是:
15.2
2.2
2.2
垃圾不会在这些数字和最后之间取点;我在模式中缺少什么?
2 nd 问题:#.@
将被视为
#
.
@
而不是#.@
! !!!
答案 0 :(得分:1)
请注意.
将匹配任何字母。如果你想匹配一个“。” (句号;句号;小数点)然后你需要\.
。
另外,5.2.2.2.2.2
可以匹配数字5.2
.2
.2
.2
.2
,因此不包含垃圾。
更一般地说,我认为使用正则表达式你想要做的事情是不可能的。我没有证据,但我很确定你会更好地匹配单词和数字,然后标记留下的垃圾:
>>> everything = re.compile(r'(?:[+-]?\d+(?:\.\d*)?|[+-]?\.\d+)|\w+|(.)')
>>> everything.findall('123 . &^%! a.b 3.14')
['', ' ', '.', ' ', '&', '^', '%', '!', ' ', '', '.', '', ' ', ' ', '']
但它没有分组。不同之处在于这会强制从左到右的顺序。如果你开始尝试做回顾,你会遇到严重的歧义问题,多种方法来划分5.2.2
等。
以上工作通过匹配数字或单词,但不形成组。然后,如果其他一切都失败了,它会匹配一块垃圾并再次尝试。