我需要解析包含登录名和用户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()
解决了这个问题,但我仍然想知道我错在哪里。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:4)
答案 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()