无法使用re.findall()填充列表

时间:2019-04-18 22:07:52

标签: python regex python-3.x

我正在做一个简单的个人项目,这需要我学会使用正则表达式。我以前在程序中成功使用过一次findall():

def getStats():
    playername = input("Enter your OSRS name: ")
    try:
        with urllib.request.urlopen("https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player=" + playername) as response:
            page = str(response.read())
            player.levels = re.findall(r',(\d\d),', page)

这很好用,并且完全按照我的意愿填充了列表。我现在正在尝试对文本文件执行类似的操作。

文本文件包含一个字符串,后跟很多数字,然后是另一个字符串,后跟很多数字,依此类推。我只想用文本填充列表,并忽略数字,但没有找到匹配项(列表为空):

def getQuests():
    try:
        with open("quests.txt") as file:
            q = file.read()
            questList = re.findall(r',(\D\D),', q)
            print(questList)

Pythex链接:https://pythex.org/?regex=%5CD%5CD&test_string=Desert%20Treasure%2C0%2C0%2C0%2C12%0AContact!%2C0%2C0%2C11%2C0%2C0%2C0%2C5%0ACook%27s%20Assistant%2C0%2C0%2C0%2C0%0AHorror%20from%20the%20Deep%2C0%2C0%2C13&ignorecase=0&multiline=0&dotall=0&verbose=0

我在模式上获得了一些帮助,并进行了相应的编辑,但是列表仍然显示空白

def getQuests():
    try:
        with open("quests.txt") as file:
            q = file.read()
            questList = re.findall(r'^(\D+),', q)

2 个答案:

答案 0 :(得分:1)

您的模式不正确。首先,在您链接的演示中,网站的设计不是很好,并且将相邻的匹配项显示为一个匹配项。 \D\D精确匹配2个非数字字符。另外,您没有在代码中包括模式中的逗号。无论如何,这是一个正确的模式:

^(\D+),

它匹配行的开头,然后匹配至少一个非数字字符,再匹配一个逗号。第一组包含您要匹配的字符串。

演示:https://regex101.com/r/pViF0h/2

在代码中:

import re

text = '''Desert Treasure,0,0,0,12
Contact!,0,0,11,0,0,0,5
Cook's Assistant,0,0,0,0
Horror from the Deep,0,0,13'''

print(re.findall(r'^(\D+),', text, re.M))
# ['Desert Treasure', 'Contact!', "Cook's Assistant", 'Horror from the Deep']

如果无论您要输入的是第一个条目,也可以使用:

^(.+?),

此外,对于这些文件,通常最好将其读取为CSV并以这种方式提取所需内容。

答案 1 :(得分:0)

您的TypeError解决方案是正确的。

我不知道该网页的外观,但确实看到了一个问题。在工作示例中,您使用',(\d\d),',但在问题一中,您使用,(\D\D),\d匹配任何数字字符,而\D匹配任何数字。