我有以下列表:
l = ['(PREDIR )?NAME SUFTYP|PREDIR NAME( SUFTYP)?', '(PREDIR )?NAME|PREDIR NAME', '(PREDIR )?PRETYP NAME SUFTYP( SUFDIR)?|PREDIR (PRETYP )?NAME( SUFTYP)? SUFDIR', '(PREDIR )?PRETYP NAME|PREDIR (PRETYP )?NAME', 'NAME SUFTYP( SUFDIR)?|NAME( SUFTYP)? SUFDIR', 'NAME SUFTYP|NAME( SUFTYP)?', 'NAME|NAME', 'PRETYP NAME ( SUFDIR)?|(PRETYP )?NAME SUFDIR']
我想仅在?
的一侧找到包含|
的项目,并仅替换包含?
的一侧。
具体来说,我希望我希望l
中的项目替换为以下内容:
'(PREDIR )?NAME|PREDIR NAME'
- > '(PREDIR )?NAME'
'(PREDIR )?PRETYP NAME|PREDIR (PRETYP )?NAME'
- > '(PREDIR )?PRETYP NAME|PREDIR (PRETYP )?NAME'
'NAME SUFTYP|NAME( SUFTYP)?'
- > 'NAME( SUFTYP)?'
我能想到这样做的唯一方法是通过迭代过程,我在左侧检查?
而不是在右侧检查,然后反之亦然。
但以下情况不起作用。
for i in l:
i = re.sub(r'(.*?\?.*?)(\|.*?[^?].*?)',r'\1',i)
答案 0 :(得分:1)
试试这个:
l = ['(PREDIR )?NAME SUFTYP|PREDIR NAME( SUFTYP)?', '(PREDIR )?NAME|PREDIR NAME',
'(PREDIR )?PRETYP NAME SUFTYP( SUFDIR)?|PREDIR (PRETYP )?NAME( SUFTYP)? SUFDIR',
'(PREDIR )?PRETYP NAME|PREDIR (PRETYP )?NAME',
'NAME SUFTYP( SUFDIR)?|NAME( SUFTYP)? SUFDIR', 'NAME SUFTYP|NAME( SUFTYP)?',
'NAME|NAME', 'PRETYP NAME ( SUFDIR)?|(PRETYP )?NAME SUFDIR']
import re
l2 = []
for elem in l:
inner = re.split("\|", elem);
left = '?' in inner[0]
right = '?' in inner[1]
if (left and right) or not (left or right):
# Either both side of `|` have `?` or none of the sides have `?`
l2.append(elem)
elif left:
l2.append(inner[0])
else:
l2.append(inner[1])
print l2
答案 1 :(得分:1)
因此,如果我理解你,你想要将字符串拆分为|
,如果其中只有一个部分有?
,那么返回该字符串,否则返回字符串?我不确定正则表达式是否值得头痛:为什么不呢
def fix(s):
has_qmark = [part for part in s.split("|") if '?' in part]
return has_qmark[0] if len(has_qmark) == 1 else s
代替?它实际上是英文的。
>>> fix('(PREDIR )?NAME|PREDIR NAME')
'(PREDIR )?NAME'
>>> fix('(PREDIR )?PRETYP NAME|PREDIR (PRETYP )?NAME')
'(PREDIR )?PRETYP NAME|PREDIR (PRETYP )?NAME'
>>> fix('NAME SUFTYP|NAME( SUFTYP)?')
'NAME( SUFTYP)?'