0

我的以下数据:

'DOMA A\r\nName: Ryan\r\nBest: 1\r\nAlias: 3K\r\nLocation: Eng\r\nGame Wins: 51\r\nTime: 09:10:50'

使用正则表达式模式查找所有内容时遇到一些问题......

pattern1 = re.compile('DOMA: (.*)\r\n')
pattern2 = re.compile('Name: (.*)\r\n')
pattern3 = re.compile('Best: (.*)\r\n')
pattern4 = re.compile('Location: (.*)\r\n')
pattern5 = re.compile('Game Wins: (.*)\r\n')
pattern6 = re.compile('Time: (.*)')

所有上述工作,但有时我的数据看起来像: 'DOMA A\r\nName: Ryan\r\nBest: 1\r\nAlias: 3K\r\nLocation: Eng\r\nGame Wins: 51\r\nTime: 09:10:50\r\nREF: Yes'

Pattern6,返回不正确,因为它没有 /r/n...我怎样才能解决这个问题,以便它只返回当前行上的内容...~

模式 6 应该是这样的:

pattern6 = re.compile(r'Time: (.*)')

或者

pattern6 = re.compile('Time: (.*?)')

或者

pattern6 = re.compile(r'Time: (.*?)')

提前致谢 - Hyflex

4

2 回答 2

3

制作分隔符\r\n $(这意味着正则表达式中的“字符串结尾”) - 也 - 而不是多个模式,只需使用一个通用模式,并将其放入字典中,然后在之后提取命名部分:

s = 'DOMA A\r\nName: Ryan\r\nBest: 1\r\nAlias: 3K\r\nLocation: Eng\r\nGame Wins: 51\r\nTime: 09:10:50'
import re
res = dict(re.findall(r'(.*?): (.*?)(?:\r\n|$)', s))
# {'Name': 'Ryan', 'Alias': '3K', 'Location': 'Eng', 'Time': '09:10:50', 'Game Wins': '51', 'Best': '1'}
于 2013-08-25T14:53:12.880 回答
1

这就是 re.MULTILINE(简称 re.M)所针对的问题。将模式编译为:

pattern6 = re.compile(r"Time: .*$", flags=re.M)

您可以通过使用 r"^Time: .*$" 使其更具体,要求 "Time:" 开始一行,或者使用 r"^\s*Time: .*$" 添加一些前导空格容差。

也许这是偏执狂,但在搜索之前我要做的第一件事就是过滤掉 \r\n 换行符。我不必在 Windows Python 2.7 上执行此操作,但我没有在文档中看到所有环境都会同等对待 \r\n 和 \n 的保证。最简单的方法是re.sub("\r\n", "\n", s)将 s 中的每个“\r\n”替换为“\n”。[注意:更简单的方法是使用 s.replace(),但正如我在评论中所说,这是有效的。]

s1 = 'DOMA A\r\nName: Ryan\r\nBest: 1\r\nAlias: 3K\r\nLocation: Eng\r\nGame Wins: 51\r\nTime: 09:10:50'
s2 = 'DOMA A\r\nName: Ryan\r\nBest: 1\r\nAlias: 3K\r\nLocation: Eng\r\nGame Wins: 51\r\nTime: 09:10:50\r\nREF: Yes'

print "s1: ", pattern6.findall( re.sub('\r\n', '\n', s1) )
print "s2: ", pattern6.findall( re.sub('\r\n', '\n', s2) )

输出:

s1:  ['Time: 09:10:50']
s2:  ['Time: 09:10:50']

这里的另一个优点是 ^ 和 $ 不捕获任何内容,因此您最终不会将 \r\n 作为匹配的一部分,并且您不需要添加括号来实现这一点。

于 2013-08-25T16:37:01.663 回答