我正在尝试使用Python Regex。我有一个如下列表:
['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-2', 'MYTAB-PERF','ABC','DEF']
我需要选择以MYTAB
开头的所有值,不包括MYTAB-2
。
结果应该是:
['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-PERF']
它应该是什么样的正则表达式?
答案 0 :(得分:2)
您可以使用这段代码。
l1
,如果项目startswith("MYTAB")
,则会将其添加到列表l2
MYTAB-2
列表l2
的索引
MYTAB-2
<强>代码:强>
l1 = ['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-2', 'MYTAB-PERF','ABC','DEF']
l2 = []
for item in l1:
#add item to l2 if startswith MYTAB
if item.startswith('MYTAB'):
l2.append(item)
#getting index of 'MYTAB-2'
index = l2.index('MYTAB-2')
#removing MYTAB-B
del(l2[index])
#printing l2
l2
输出:
['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-PERF']
答案 1 :(得分:1)
在列表理解中使用re
的过滤器:
import re
l = ['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-2', 'MYTAB-PERF','ABC','DEF']
l = [i for i in l if re.match(r'MYTAB-[^2]', i)]
print(l)
# ['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-PERF']
答案 2 :(得分:1)
>>> import re
>>> list_ = ['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-2', 'MYTAB-PERF', 'ABC', 'DEF']
>>> filtered_list = filter(lambda str_: re.search(r'^MYTAB(?!-2)', str_), list_)
>>> filtered_list
['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-PERF']
答案 3 :(得分:1)
您可以使用多种方法过滤列表。如果您使用的'MYTAB(?!-2)'
与输入的开头相匹配,则问题的基本答案为re.match
。
import re
expr = re.compile('MYTAB(?!-2)')
rawList = ['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-2', 'MYTAB-PERF','ABC','DEF']
filteredList = [x for x in rawList if expr.match(x)]
但是,由于您正在查看前缀,因此有一种更简单的方法:
filteredList = [x for x in rawList if x.startswith('MYTAB') and x not x.startswith('MYTAB-2')]
如果由于任何原因你对列表推导不满意,你可能想要使用内置filter
函数:
filteredList = list(filter(expr.match, rawList))
甚至
filteredList = list(filter(lambda x: x.startswith('MYTAB') and not x.startswith('MYTAB-2'), rawList))
此外,如果您不希望保留对预编译表达式的引用(例如,简洁的交易效率),则可以使用re.match
代替re.compile.match
:
import re
rawList = ['MYTAB-EVENTS', 'MYTAB-1', 'MYTAB-2', 'MYTAB-PERF','ABC','DEF']
filteredList = [x for x in rawList if re.match(x)]
答案 4 :(得分:0)
您可以使用正则表达式/MYTAB-[^2]+/
。语法[^2]
表示除2
之外的所有内容。
答案 5 :(得分:0)
尝试使用pyregex查找正则表达式搜索。对于您的问题,这是一个link到正在运行的正则表达式
在这种情况下,它使用MYTAB-[^2]
作为正则表达式模式。