我正在做一个简单的个人项目,这需要我学会使用正则表达式。我以前在程序中成功使用过一次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)
我在模式上获得了一些帮助,并进行了相应的编辑,但是列表仍然显示空白
def getQuests():
try:
with open("quests.txt") as file:
q = file.read()
questList = re.findall(r'^(\D+),', q)
答案 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
匹配任何非数字。