FindAll - 定位带有图案的线条

时间:2018-05-05 03:26:03

标签: python regex python-3.x

我正在尝试为以下模式抓取文件:

Str[SPACE][MINUS]Str[SPACE]Number[SPACE][SPACE]Number[SPACE]Number
  • Str可以有空格
  • Str可以有国际字符(所以它不仅是a-z-A-Z)
  • 数字可以是正数或负数

匹配的行的示例(不带“”)

 John Anderson - Hong Kong 24  486 2

 Fred Peters - Shanghai -4  186 0

注意:我不知道为什么stackexchange将2个空格转换为1个空格,但是在2个第一个数字之间有2个空格。

我认为这样做是对的:

import re
text = open('pokertournament.txt') 
for line in text: 
    x = re.findall(r'.*(\s+[\-]+\s+[a-zA-Z]+\s+[0-9\-]+\s+\s+[0-9\-]?).*', line)

    if len(x) != 0:
        print(line)

我在尝试的是寻找一个简单的模式:

  

[SPACE] [MINUS] [海峡] [SPACE]号码[SPACE]编号[SPACE] [SPACE]

但是如果我在包含这个内容的文本文件上运行它:

OLD - Break in, Allin win 1  Total Cards  Total Score Total Cards
John Anderson - Hong Kong 24  486 2
Fred Peters - Shanghai -4  186 0
OLD - Break in, Allin win 1  Total Cards  Total Score Total Cards
Peter Anderson - Tokyo Habor 24  486 2

然后结果是它只找到这一行:

Fred Peters - Shanghai -4  186 0

任何人都可以帮我纠正这个表达方式,以便我能够理解如何正确使用它?

1 个答案:

答案 0 :(得分:0)

您可以使用(?m)^[a-zA-Z]+\s[a-zA-Z]+[- ]+[a-zA-Z\s]+\s[-\d\s]+$

(?m)表示多行匹配。

行动中:

s = """
OLD - Break in, Allin win 1  Total Cards  Total Score Total Cards
John Anderson - Hong Kong 24  486 2
Fred Peters - Shanghai -4  186 0
OLD - Break in, Allin win 1  Total Cards  Total Score Total Cards
Peter Anderson - Tokyo Habor 24  486 2
"""
import re
print(re.findall(r'(?m)^[a-zA-Z]+\s[a-zA-Z]+[- ]+[a-zA-Z\s]+\s[-\d\s]+$', s))

输出:

['John Anderson - Hong Kong 24  486 2', 'Fred Peters - Shanghai -4  186 0', 'Peter Anderson - Tokyo Habor 24  486 2\n']