2011-12-19 2 views
1

Учитывая строку #abcde#jfdkjfd, как я могу получить строку между двумя #? И я также хочу, чтобы, если нет пары # (означает нет # или только один #), функция вернет None.python string parsing с использованием регулярного выражения

+0

Кажется, вы можете достичь этого с помощью обычного регулярного выражения. Взгляните на http://www.regular-expressions.info/. –

ответ

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+)(?=#) и захватить первую группу. Вы можете даже перебирать строку, содержащую несколько встроенных строк, и она будет работать.

Это использует как положительный lookbehind, так и положительный взгляд.

+0

Вам не нужна группа вообще, так как поисковые запросы не являются частью матча. –

+0

Да, это правда ... Просто привычка! – fge

1

Если вы не настаиваете на регулярных выражениях и готовы принять пустой список вместо None для случая, когда нет результатов, то простой способ является:

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

Обратите внимание, что результат действительно должен быть списком, так как вы могли бы иметь более одного результата.

Если вы настаиваете на том, чтобы None вместо пустого списка (хотя и не совершенны, как это было бы также превратить любую пустую строку в 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'