Python正则表达式,在文本文件中查找垃圾字

时间:2012-03-24 15:34:01

标签: python regex

到目前为止,我们已经有了这个

re.findall(r'[+-](?!\d)|(?<!\d)[.]|[^\+\-.\d\w\s]+',str)

但不会在数字之间取点,而@.%会将每个数字作为一个单词而不是一个单词。

第一个示例问题:15.2.2.2.2.2.是:

  1. 15.2
  2. 2.2
  3. 2.2
  4. 垃圾不会在这些数字和最后之间取点;我在模式中缺少什么?


    2 nd 问题:#.@

    将被视为

    1. #
    2. .
    3. @
    4. 而不是#.@! !!!

1 个答案:

答案 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等。

以上工作通过匹配数字或单词,但不形成组。然后,如果其他一切都失败了,它会匹配一块垃圾并再次尝试。