Python 正则表达式文本提取



文本输入是这样的West Team 4, Eastern 3n

-------更新--------

输入是一个TXT文件,其中包含球队名称和比分,如足球比赛 整个文本文件将是这样的,两个名称和分数:

West Team 4, Eastern 5
Nott Team 2, Eastern 3
West wood 1, Eathan 2
West Team 4, Eas 5

我正在使用with open逐行读取文件,因此行尾会有n

我想将这行文本提取为以下内容:

['West Team', 'Eastern']

我目前想到的是使用正则表达式

result = re.sub("[n^s$d]", "", text).split(",")

此代码的结果如下:

['WestTeam','Eastern']

我确定我的正则表达式不正确。我想删除""和任何数字,包括数字前面的空格,而不是名称中间的空格。

对任何建议持开放态度,以实现此结果,不一定使用正则表达式。

有很多方法可以做到这一点,但是查看您的数据,您可以很好地使用rstrip()

s = 'West Team 4, Eastern 3n'
lst = [x.rstrip('n 0123456789') for x in s.split(', ')]
print(lst)

或者更确切地说是使用:

from string import digits
s = 'West Team 4, Eastern 3n'
lst = [x.rstrip(digits+'n ') for x in s.split(', ')]
print(lst)

两个选项都打印:

['West Team', 'Eastern']

您可以使用非正则表达式方法在用逗号拆分后保留任何字母/空格:

text = "West Team 4, Eastern 3n"
print( ["".join(c for c in x if c.isalpha() or c.isspace()).strip() for x in text.split(',')]  )
# => ['West Team', 'Eastern']

或者使用正则表达式方法来删除除 ASCII 字母和空格以外的任何字符,与[^a-zA-Zs]+模式匹配:

import re
rx = re.compile(r'[^a-zA-Zs]+')
print( [rx.sub("", x).strip() for x in text.split(',')]  )
# => ['West Team', 'Eastern']

另一个类似的解决方案可用于在可选的逗号 + 空格之后提取一个或多个非数字字符块:

print(re.findall(r',?s*(D*[^ds])', text))

请参阅 Python 演示。

如果有连续的非字母块

,您可以使用
import re
text = "West Team 4, Eastern 3n, test 23 99 test"
rx = re.compile(r'[^Wd_]+')
print( [" ".join(rx.findall(x)) for x in text.split(',')]  )

请参阅生成['West Team', 'Eastern', 'test test']的 Python 演示。[^Wd_]+模式匹配任何一个或多个 Unicode 字母。

实际上re.findall在这里可能很好用:

inp = "West Team 4, Eastern 3n"
matches = re.findall(r'(w+(?: w+)*) d+', inp)
print(matches)  # ['West Team', 'Eastern']

拆分版本,使用re.split

inp = "West Team 4, Eastern 3n"
matches = [x for x in re.split(r's+d+s*,?s*', inp) if x != '']
print(matches)  # ['West Team', 'Eastern']
import re
text = 'West Team 4, Eastern 3n'
result = re.sub("[n^$d]", "", text).split(",")
# REMOVE THE LEADING AND TRAILING SPACES:
result = [x.strip() for x in result]
print(result)
# result: ['West Team', 'Eastern']

您希望:

  • 删除""和
  • 任何数字,包括数字前面的空格
  • 但不是名称中间的空格。

要使用的函数:

  • 对于恒定的零件,您可以使用str.replace()更换。
  • 对于所有动态匹配,我们需要一个正则表达式来使用re.sub()替换为空字符串。
  • 对于周围环境,我们甚至可以使用str.strip()删除前导和尾随空格,例如n.

法典

import re
input = "West Team 4, Eastern 3n"
cleaned = re.sub(r's+d', '', input)  # remove numbers with leading spaces
cleaned = cleaned.strip()  # remove surrounding whitespace like n
print(cleaned)
output = cleaned.split(",") 
print(output)

指纹:

West Team, Eastern
['West Team', 'Eastern']

您可以删除数字并用单个空格替换可能的双倍间距。

然后拆分为逗号,不要保留空值并修剪输出:

import re
s = "West Team 4 , Eastern 3, test 23 99 testn,"
res = [
m.strip() for m in re.sub(r"[^Sn]{2,}", " ", re.sub(r"d+", "", s)).split(",") if m
]
print(res)

输出

['West Team', 'Eastern', 'test test']

查看 Python 演示。

您尚未明确定义从示例输入获取所需输出的规则。但是,这将提供您所要求的内容,但可能无法涵盖所有可能性:

in_string = 'West Team 4, Eastern 3n'
result = [' '.join(t.split()[:-1]) for t in in_string.split(',')]
print(result)

输出:

['West Team', 'Eastern']

最新更新