2013-02-15 159 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