Учитывая строку #abcde#jfdkjfd
, как я могу получить строку между двумя #
? И я также хочу, чтобы, если нет пары #
(означает нет #
или только один #
), функция вернет None
.python string parsing с использованием регулярного выражения
ответ
>>> 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 #
Используйте (?<=#)(\w+)(?=#)
и захватить первую группу. Вы можете даже перебирать строку, содержащую несколько встроенных строк, и она будет работать.
Это использует как положительный lookbehind, так и положительный взгляд.
Вам не нужна группа вообще, так как поисковые запросы не являются частью матча. –
Да, это правда ... Просто привычка! – fge
Если вы не настаиваете на регулярных выражениях и готовы принять пустой список вместо 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'
Кажется, вы можете достичь этого с помощью обычного регулярного выражения. Взгляните на http://www.regular-expressions.info/. –