Edit2: It wasn't clear if your test data
contained pipes or not. I saw the pipes in
the regex and assumed you are searching
for pipe delim. Oh well.. not sure if below
helps.
使用正则表达式匹配以竖线分隔的文本将需要更多的交替来选择开始列和结束列。
另一种方法呢?
text='start piston|xxx|piston ring|xxx|piston cast|xxx|piston|xxx|stock piston|piston end'
j=re.split(r'\|',text)
k = [ x for x in j if x.find('piston') >= 0 ]
['start piston', 'piston ring', 'piston cast', 'piston', 'stock piston', 'piston end']
k = [ x for x in j if x.startswith('piston') ]
['piston ring', 'piston cast', 'piston', 'piston end']
k = [ x for x in j if x == 'piston' ]
['piston']
j=re.split(r'\|',text)
if 'piston ring' in j:
print True
> True
编辑:澄清 - 以这个例子:
text2='piston1|xxx|spiston2|xxx|活塞环|xxx|piston3'
我添加“。”匹配任何东西以显示匹配的项目
re.findall('piston.',text2)
['piston1', 'piston2', 'piston ', 'piston3']
为了使其更准确,您需要使用后视断言。
这保证您匹配 '|piston' 但结果中不包含管道
re.findall('(?<=\|)piston.',text2)
['piston ', 'piston3']
限制从贪心匹配到第一个匹配字符 .*?
添加分组括号以排除管道。比赛.*?足够聪明,可以检测是否在组内并忽略括号并使用下一个字符作为停止匹配标记。这似乎有效,但它忽略了最后一列。
re.findall('(?<=\|)(piston.*?)\|',text2)
['piston ring']
当您添加分组时,您现在可以指定以转义管道开头
re.findall('\|(piston.*?)\|',text2)
['piston ring']
要同时搜索最后一列,请添加此非分组匹配 (?:\||$) - 这意味着匹配管道(需要转义)或 (|) 字符串的结尾 ($)。
非分组匹配 (?:x1|x2) 不包含在结果中。它得到优化的额外好处。
re.findall('\|(piston.*?)(?:\||$)',text2)
['piston ring', 'piston3']
最后,要修复字符串的开头,添加另一个更改,就像之前的更改以匹配结束字符串
re.findall('(?:\||^)(piston.*?)(?:\||$)',text2)
['piston1', 'piston ring', 'piston3']
希望对您有所帮助。 :)