首页 > 解决方案 > 在字符串列表上并行执行 if else 条件

问题描述

我是 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']

任何人都可以提出正确的方法吗?

标签: arrayspython-3.xregex

解决方案


似乎第二条规则胜过第一条规则,因此如果第二条规则匹配,请使用它,否则尝试第一条规则退回给您的内容。

与您现在拥有的解决方案接近的解决方案可能是:

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)

推荐阅读