#arrays #python-3.x #regex
Вопрос:
Я новичок в python и столкнулся с проблемой получения правильного вывода. У меня есть список строк, как :
list_string=[
'!DOC <p>The course starts next Sunday</t><div>',
"!DOC <p>class='default'<d>I don't wash the dishes</span></t>",
'When does the train usually leave'
]
Все, что я хочу, чтобы выводился как:
Output expected: [['The course starts next Sunday'], ["I don't wash the dishes"], 'When does the train usually leave']
То, что я сделал, — это нечто:
import re
subtring='!DOC'
output=[]
for i in string:
if subtring in i:
text=re.findall("<p>(.*?)</t>",i, re.DOTALL)
output.append(text)
elif subtring in i:
text=re.findall("<d>(.*?)</span>",i, re.DOTALL)
output.append(text)
else:
output.append(i)
print (output)
[['The course starts next Sunday'], ["class='default'<d>I don't wash the dishes</span>"], 'When does the train usually leave']
Может ли кто-нибудь подсказать, как это сделать правильно?
Комментарии:
1. Почему у вас два
subtring in i
теста? Второму это никогда не удастся.2. Почему вторая строка должна обрабатываться со вторым регулярным выражением вместо первого?
3. Делайте и то и другое в одном и том же
if
блоке.4. Я не понимаю твоей логики. Вторая строка соответствует обоим регулярным выражениям. Почему вывод должен содержать результат 2-го
findall
, а не 1-го?5. Как узнать, что нужно исключить
class='default'
из результата?
Ответ №1:
Похоже, что второе правило превосходит первое, поэтому, если есть совпадение по второму правилу, используйте его в противном случае, попробуйте выполнить первое правило, возвращая то, что вам дали.
Решение, близкое к тому, что у вас есть сейчас, может быть:
import re
list_string =[
'!DOC <p>The course starts next Sunday</t><div>',
"!DOC <p>class='default'<d>I don't wash the dishes</span></t>",
'When does the train usually leave'
]
output=[]
for line in list_string:
retval = re.findall("<d>(.*?)</span>", line, re.DOTALL)
if retval:
output.append(retval[0])
continue
retval = re.findall("<p>(.*?)</t>", line, re.DOTALL)
if retval:
output.append(retval[0])
continue
output.append(line)
print (output)
Хотя, если бы это был я, я бы, вероятно, использовал небольшую функцию с пониманием:
import re
def pick_out_text(text):
retval = re.findall("<d>(.*?)</span>", text, re.DOTALL)
if retval: return retval[0]
retval = re.findall("<p>(.*?)</t>", text, re.DOTALL)
if retval: return retval[0]
return text
list_string =[
'!DOC <p>The course starts next Sunday</t><div>',
"!DOC <p>class='default'<d>I don't wash the dishes</span></t>",
'When does the train usually leave'
]
output = [pick_out_text(line) for line in list_string]
print(output)