Python正则表达式模式匹配

时间:2017-02-18 00:43:59

标签: python regex

我有以下格式的列表:

data =['| test_data_14865428_0              |', '| test_data_1486612450_0              |', '| test_template                  |', '|id_1475020800_0              |']

我想将格式test_data_ *的所有列表元素提取到一个新列表(表格)中。列表表应以test_data _ *

格式存储名称

我的尝试:

import re
tables = []
pattern = re.compile("| test_data\S")

for i in range(0, len(data)):
    if pattern.match(data[i]):
        tables.append(data[i])

print(list_of_tables)

2 个答案:

答案 0 :(得分:0)

由于您的所有数据都包含子字符串test_data_,因此您可以在不需要正则表达式的情况下过滤该静态短语:

data = filter(lambda v: 'test_data_' in v, data)

如果您想过滤掉空格和管道分隔符,可以使用translate来删除不需要的字符:

data = map(lambda v: v.translate(None, " |"), data)

当然,表达式可以组合成复合表达式。

上面原始代码中正则表达式的一个问题是|需要进行转义,因此它将按字面意思处理。目前,它被视为替代运营商。

虽然可能不是最优雅的实现,但以下是一个选项:

import re
pattern = re.compile("\| *(test_data_[\d_]+)")
def search(val):
    found = pattern.match(val)
    return found and found.group(1)
print(filter(lambda f: f, map(search, data)))

带有身份映射的过滤器只删除没有匹配的记录。

答案 1 :(得分:0)

使用filter选择包含“test_data_”的值,然后在这些值之间映射函数以清理字符串。不需要正则表达式。

import operator

td = map(lambda s: s[2:].split(' ', 1)[0], 
         filter(operator.methodcaller('startswith', '| test_data_'),
                data))
print(list(td))