如何用Python中的regexp解析这个文本文件?

时间:2015-07-17 16:08:34

标签: python regex

我需要解析包含登录名和用户ID的文本文件

+----+---------------+---------------+
| Id | Login         | Name          |
+----+---------------+---------------+
| 1  | admin         | admin         |
| 2  | admin2        | admin2        |
| 3  | ekaterina     | Ekaterina     |
| 4  | commarik      | commarik      |
| 5  | basildrescher | BasilDrescher |
| 6  | danielalynn   | DanielaLynn   |
| 7  | rosez13yipfj  | RoseZ13yipfj  |
| 8  | veolanoyes    | VeolaNoyes    |
| 9  | angel         | Angel         |
| 10 | michalea44    | MichaleA44    |
+----+---------------+---------------+

所以我使用re,就像这样:

import re
fh = open('test1.txt')
lines = fh.readlines()
for line in lines:
        #print line
        p = re.compile(r"|(.*?)|")
        m2 = p.search(line)
        if m2:
                print m2.group(0)

问题是我无法获得所需的结果!我尝试了各种空格和制表符组合,但它没有用。我用split()解决了这个问题,但我仍然想知道我错在哪里。任何帮助,将不胜感激。谢谢!

5 个答案:

答案 0 :(得分:4)

您有多个错误:

  • |未转义
  • 您只有一个组,因此您只提取第一列。

正则表达式应该是这样的:

\|(.*?)\|(.*?)\|(.*?)\|

您可以看到演示here

答案 1 :(得分:4)

如果你不想要花哨的数据,你可以使用单词字符和数字。

  

γ“([\ d \ W] +)

下面的示例用法
In [27]: data = """+----+---------------+---------------+
....:     | Id | Login         | Name          |
....:     +----+---------------+---------------+
....:     | 1  | admin         | admin         |
....:     | 2  | admin2        | admin2        |
....:     | 3  | ekaterina     | Ekaterina     |
....:     | 4  | commarik      | commarik      |
....:     | 5  | basildrescher | BasilDrescher |
....:     | 6  | danielalynn   | DanielaLynn   |
....:     | 7  | rosez13yipfj  | RoseZ13yipfj  |
....:     | 8  | veolanoyes    | VeolaNoyes    |
....:     | 9  | angel         | Angel         |
....:     | 10 | michalea44    | MichaleA44    |
....:     +----+---------------+---------------+"""

In [32]: matches = re.findall(r"([\d\w]+)", data)
In [36]: matches
Out[36]: ['Id', 'Login', 'Name', '1', 'admin', 'admin', '2', 'admin2', 'admin2', '3', 'ekaterina', 'Ekaterina', '4', 'commarik', 'commarik', '5', 'basildrescher', 'BasilDrescher', '6', 'danielalynn', 'DanielaLynn', '7', 'rosez13yipfj', 'RoseZ13yipfj', '8', 'veolanoyes', 'VeolaNoyes', '9', 'angel', 'Angel', '10', 'michalea44', 'MichaleA44']

答案 2 :(得分:3)

|是正则表达式中的一个特殊字符,用于"或者将两个表达式放在一起。您需要将其转义为\|以匹配实际角色。此外,search()会找到一个匹配项。您可能希望查看其他方法,例如findall

答案 3 :(得分:1)

尝试使用此正则表达式将每个单独的行捕获为单独的捕获组,根据语法:

\|\s*([0-9]+)\s*\|\s*([\w]+)\s*\|\s*([\w]+)\s*\|

或者,使用此方法捕获您在上面尝试的相同方式(也会获得标题):

\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|

这是第一个demo

正如其他两个人已经说过的那样,你没有逃脱你的管道角色,这一直在弄乱。

另外,你没有考虑单词边缘的空格,所以我添加了\s正则表达式模式,并将其保留在捕获组之外,以便更好地获得。

答案 4 :(得分:1)

是的,类似下面的内容可行;

import re
fh = open('test1.txt')
lines = fh.readlines()
for line in lines[2:]:
    p = re.compile(r"\|(?P<id>.*)\|(?P<login>.*)\|(?P<name>.*)\|")
    if p.search(line):
        id = re.match(p, line).group('id')
        login = re.match(p, line).group('login')
        name = re.match(p, line).group('name')
        print id.strip(),login.strip(),name.strip()