文本输入是这样的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']