Невозможно заполнить список с помощью re.findall () - PullRequest
0 голосов
/ 19 апреля 2019

Я работаю над простым личным проектом, который требуется, я учусь использовать регулярные выражения.Я однажды успешно использовал 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 ]

1 голос
/ 19 апреля 2019

Ваш шаблон неверен.Во-первых, в демоверсии, на которую вы ссылались, веб-сайт не очень хорошо оформлен и показывает смежные совпадения в виде одного совпадения.\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 и извлечь то, что вам нужно таким образом.

0 голосов
/ 19 апреля 2019

Ваше решение TypeError правильное.

Не зная, как выглядит эта веб-страница, я вижу одну проблему.В вашем рабочем примере вы используете ',(\d\d),', но в проблемном вы используете ,(\D\D),.\d Соответствует любым цифровым символам, но \D соответствует любым не -значям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...