2013-02-15 129 views
0

子内的字符我有以下列表:查找使用Python正则表达式

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) 

回答

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)?' 
+0

工作正常!我会给你的答案接受的紧凑性(和避免正则表达式;)) – user1185790 2013-02-15 18:20:25

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 
+0

谢谢Rohit!您的工作完美 – user1185790 2013-02-15 18:21:20

+0

@ user1185790。不客气:) – 2013-02-15 18:22:27