Невозможно заполнить список с помощью re.findall()

#python #regex #python-3.x

#python #регулярное выражение #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',(dd),', page)
 

Это сработало нормально и заполнило список именно так, как я хотел. Сейчас я пытаюсь сделать что-то подобное с текстовым файлом.

Текстовый файл содержит строку, за которой следует много цифр, а затем другую строку, за которой следует много цифр и т.д. Я просто хочу заполнить список текстом и игнорировать цифры, но я не получаю совпадений (список пуст):

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

Ссылка на Pythex: https://pythex.org/?regex=DDamp;test_string=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,13amp;ignorecase=0amp;multiline=0amp;dotall=0amp;подробный = 0

Я получил некоторую помощь с шаблоном и отредактировал его соответствующим образом, но список по-прежнему печатается пустым

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

Комментарии:

1. скопируйте / вставьте содержимое ваших файлов в regex101.com — переключите его на pyhton и вставьте свой шаблон регулярных выражений — посмотрите, что сопоставляется. Вопросы с регулярными выражениями без данных не имеют большого значения — мы не сможем помочь, если не увидим ваши данные

2. Что это за содержимое quests.txt ?

3. Извините за это, я добавил свою ссылку на pythex с некоторым примером текста

Ответ №1:

Ваш шаблон неверен. Во-первых, в демоверсии, на которую вы ссылались, веб-сайт не очень хорошо спроектирован и показывает смежные совпадения как одно совпадение. DD соответствует ровно 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. Спасибо, что помогли мне с шаблоном, очень признателен. Я поменял шаблон, но когда я печатаю список, он все еще пуст. quests.txt содержит точный текст, используемый в качестве образца в регулярном выражении101

Ответ №2:

Ваше решение TypeError является правильным.

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

Комментарии:

1. Два разных шаблона в зависимости от ввода. Первый re работает нормально, со вторым у меня проблемы. Я обновил свой OP, чтобы создать ссылку на страницу pythex с некоторым образцом текста.

2. Как написано, ,(DD), будет соответствовать только тем вещам, которые содержат ровно 2 символа без цифр между запятыми. Попробуйте что-то вроде (D ),