Выполнить, если иное условие выполняется параллельно над списком строк

#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)