2011-12-19 13 views
1

給出一個字符串#abcde#jfdkjfd解析,我怎麼能得到兩個#之間的字符串?我也想,如果沒有#對(意味着沒有#或只有一個#),該函數將返回NonePython字符串使用正則表達式

+0

看來你可以用一個基本的正則表達式來實現這一點。看看http://www.regular-expressions.info/。 – 2011-12-19 09:40:04

回答

7
>>> import re 
>>> s = "abc#def#ghi#jkl" 
>>> re.findall(r"(?<=#)[^#]+(?=#)", s) 
['def', 'ghi'] 

說明:

(?<=#) # Assert that the previous character is a # 
[^#]+ # Match 1 or more non-# characters 
(?=#) # Assert that the next character is a # 
2

使用(?<=#)(\w+)(?=#)和捕捉到的第一組。你甚至可以通過一個包含幾個嵌入字符串的字符串循環,它將起作用。

這同時使用了積極的回顧後,積極的前瞻。

+0

你並不需要一個組,因爲這些查找並不是匹配的一部分。 – 2011-12-19 09:43:02

+0

是的,那是真的......只是一種習慣! – fge 2011-12-19 09:44:43

1

如果沒有正則表達式的堅持,並願意在沒有結果的話,最簡單的方式來接受空單,而不是None的情況是:

>>> "#abcde#jfdkjfd".split('#')[1:-1] 
['abcde'] 

注意,結果真的必須是一個清單,因爲您可能有多個結果。

如果你堅持要None,而不是一個空列表的(雖然不是完美的,因爲這也將轉任爲空字符串轉換成無):

>>> "#abcde#jfdkjfd".split('#')[1:-1] or None 
['abcde'] 

如果你只想要第一個標記的字符串,那麼你可以做這個:

>>> def first_marked(s): 
    token = s.split('#') 
    if len(token) >= 3: 
     return token[1] 
    else: 
     return None 


>>> first_marked("#abcde#jfdkjfd") 
'abcde' 
相關問題