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