在Python中拆分包含某些参数的列表。使用re.findall

时间:2015-10-31 01:50:38

标签: python

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( )。谢谢!

2 个答案:

答案 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百万'属性的数字,但希望这可能会有所帮助,我不能再花时间挖掘:/

祝你好运!正则表达式是超级有趣和强大的,我希望我知道更多!