繁体   English   中英

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

[英]Splitting a list with certain parameters in Python. Using re.findall

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

您可以使用以下模式

"(?:[A-Z]|[0-9]+(?:.[0-9]+)?)[a-z]*(?: [A-Z][a-z]*)*"

它非常复杂,因为它基本上可以处理所有特殊情况,如果您对如何编写这样的表达式感兴趣,则应该深入阅读re模块的文档。https://docs.python.org/2/library/re.html

我认为您要研究的是正则表达式中的否定(和/或肯定)“向后看”。 我在想这样的事情:

([A-Z][a-z]*)((?<!\s)[A-Z][a-z\s]*(?<=\s)[A-Z][a-z]*)*

但是,我在regex上很糟糕,只能从视觉上看到这很草率,所以我期待有人纠正我:)无论如何,虽然我确信可以做得更好,但是

(?<!\s)

表示在任何时候前身都不是空格字符的后视。

(?<=\s)

表示在任何时候前一个字符都是空格字符的后向。

我去了https://regex101.com/并使用了我在顶部为正则表达式提供的正则表达式,以及以下行:

MidfielderEnglandAston VillaManchester City3.4million

作为要匹配的文本,它看起来很有希望。.我没有解决您需要考虑存在的'340万'属性的数字的任何问题,但希望这可能对您有所帮助,我可以不要再花时间在:/

祝你好运! regex超级有趣且功能强大,我希望我能了解更多!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM