根据另一个列表中的模式匹配创建一个新列表

Create a new list based on pattern matching in another list

我有一个字符串列表,我想检查一个模式,如果模式匹配则将两个元素组合在一起并创建一个新列表。

例如,这是我的清单:

string_ = ["aBc", "ab","12abc55", "ABAB", "125"]

如何 - 如果列表中的第二项是字符串(内部没有数字)并且列表中的第三项是数字和字符的组合,那么我想将它们与 space之间。我的最终输出应该是:

["aBc", "ab 12abc55", "ABAB", "125"]

我试过以下方法:

    def hasNumbers(inputString):
        return bool(re.search(r'\d', inputString))

    data = []
    for i in range (0,len(string_)):


            if string_[1].isalnum() and hasNumbers(string_[2]):
                data.append(string_[1]+ " "+ string_[2])
            else:
                data.append(string_[i])

这没有给出预期的输出。

在这里用for循环遍历列表没有意义,因为你想做的操作只需要做一次。所以你不需要循环。您可以用这些替换 for 循环以获得预期的结果:

a,b,c,d = string_
if b.isalnum() and hasNumbers(c):
        data = [a, b + ' ' +  c, d]
else:
    data = string_

我会复制整个列表,只有在满足条件时才更新它
对于第二个和第三个元素:

import re

string_ = ["aBc", "ab", "12abc55", "ABAB", "125"]


def hasNumbers(inputString):
    return bool(re.search(r'\d', inputString))


data = string_.copy()
if data[1].isalnum() and hasNumbers(data[2]):
    data[1] += f' {data.pop(2)}'

print(data)
['aBc', 'ab 12abc55', 'ABAB', '125']

如果您想使用循环,则需要使用 i 来读取列表的值:

import re
string_ = ["aBc", "ab", "12abc55", "ABAB", "125", "aBc", "ab", "12abc55", "ABAB", "125"]

def hasNumbers(inputString):
    return bool(re.search(r'\d', inputString))

for i in range (0, len(string_)-1):
    if string_[i].isalnum() and hasNumbers(string_[i+1]):
        data.append(string_[i]+ " "+ string_[i+1])
    else:
        data.append(string_[i])
print(data)

输出:

['aBc', 'ab 12abc55', '12abc55', 'ABAB 125', '125', 'aBc', 'ab 12abc55', '12abc55', 'ABAB 125']