import re
def processFile(filename='Names.txt', encode='utf-8'):
listOfPlayers = []
listOfInfo = []
count = 0
with open(filename, 'r', encoding = encode) as f:
for line in f.readlines():
if count == 0:
listOfInfo.append(line.strip())
count += 1
elif count == 1:
listOfInfo.append(line.strip())
listOfPlayers.append(listOfInfo)
count -= 1
listOfInfo = []
return listOfPlayers
def splitStats(listOfPlayers):
newList = []
for item in (i[1] for i in listOfPlayers):
m = re.findall('[A-Z][a-z]*', item)
newList.append(m)
print(newList)
def main():
lOP = processFile()
splitStats(lOP)
if __name__ == '__main__':
main()
我正在尝试查看足球的一些统计数据,并从网页上获取一些统计数据,并尝试将每个玩家分别与位置,国家/地区,转移地点,转移到的位置以及为他们付钱。
我的Names.txt文件如下所示:
Donyell Malen
AttackerNetherlandsArsenalAjaxUndisclosed
Petr Cech
GoalkeeperCzech Rep.ArsenalChelsea14million
Scott Sinclair
MidfielderEnglandAston VillaManchester City3.4million
我的processFile中的listOfPlayers有一个列表列表。将玩家作为索引零,其余信息如下:
[['Donyell Malen', 'AttackerNetherlandsArsenalAjaxUndisclosed'], ['Petr Cech', 'GoalkeeperCzech Rep.ArsenalChelsea14million'], ['Scott Sinclair', 'MidfielderEnglandAston VillaManchester City3.4million'],
我正在尝试解析每个项目和1个索引以将其拆分。我找到了re.findall()方法,但是已经搜索了API一小时,但仍然没有关于如何从大写字母中分离出来的清晰图片(尽管代码是那样做的)我需要保留任何两个单词一个字符串之间的空格。即“阿斯顿维拉”应该保持在一起,如何保持费用,即“340万”为340万。
我知道这是一个很长的问题,但是我想给出一个很好的概述,看看我是否真的错了,或者我是否在正确的轨道上,只需要帮助re.findall( )。谢谢!
答案 0 :(得分:1)
您可以使用以下模式
"(?:[A-Z]|[0-9]+(?:.[0-9]+)?)[a-z]*(?: [A-Z][a-z]*)*"
它非常复杂,因为它基本上处理所有特殊情况 如果你对如何编写这样的表达式感兴趣,你应该深入研究re模块的文档 https://docs.python.org/2/library/re.html
答案 1 :(得分:0)
我认为你想要研究的是你的正则表达式中的负面(和/或正面)“后视”。我在想这样的事情:
([A-Z][a-z]*)((?<!\s)[A-Z][a-z\s]*(?<=\s)[A-Z][a-z]*)*
但是,我在正则表达式上非常糟糕,只能在视觉上看到这是草率的,所以我期待有人纠正我:)无论如何,虽然我确信这可以做得更好,
(?<!\s)
表示前一个字符不是空白字符的任何时候的lookbehind ......就像:
(?<=\s)
表示前一个字符是空格字符的任何时候的lookbehind。
我去了https://regex101.com/ 并使用我在顶部为正则表达式提供的正则表达式和行:
MidfielderEnglandAston VillaManchester City3.4million
作为要匹配的文本,它看起来非常有希望..我没有解决任何关于你需要考虑的'3.4百万'属性的数字,但希望这可能会有所帮助,我不能再花时间挖掘:/
祝你好运!正则表达式是超级有趣和强大的,我希望我知道更多!