Как извлечь подстроку между двумя маркерами?
допустим, у меня есть строка 'gfgfdAAA1234ZZZuijjk'
и я хочу извлечь только '1234'
часть.
Я знаю только то, что будет несколько персонажей, непосредственно перед AAA
, и после ZZZ
часть, которая меня интересует 1234
.
С sed
можно сделать что-то подобное с строку:
echo "$STRING" | sed -e "s|.*AAA(.*)ZZZ.*||"
и это даст мне 1234
как результат.
как сделать то же самое в Python?
12 ответов
С помощью регулярных выражений - документация дополнительная информация
import re
text = 'gfgfdAAA1234ZZZuijjk'
m = re.search('AAA(.+?)ZZZ', text)
if m:
found = m.group(1)
# found: 1234
или:
import re
text = 'gfgfdAAA1234ZZZuijjk'
try:
found = re.search('AAA(.+?)ZZZ', text).group(1)
except AttributeError:
# AAA, ZZZ not found in the original string
found = '' # apply your error handling
# found: 1234
>>> s = 'gfgfdAAA1234ZZZuijjk'
>>> start = s.find('AAA') + 3
>>> end = s.find('ZZZ', start)
>>> s[start:end]
'1234'
тогда вы можете использовать regexps с модулем re, если хотите, но это не обязательно в вашем случае.
регулярные выражения
import re
re.search(r"(?<=AAA).*?(?=ZZZ)", your_text).group(0)
вышеприведенное as-is потерпит неудачу с AttributeError
если нет " AAA "и" ZZZ " в your_text
string методы
your_text.partition("AAA")[2].partition("ZZZ")[0]
выше будет возвращена пустая строка, если " AAA "или" ZZZ " не существуют в your_text
.
PS Python вызов?
можно использовать re модуль для этого:
>>> import re
>>> re.compile(".*AAA(.*)ZZZ.*").match("gfgfdAAA1234ZZZuijjk").groups()
('1234,)
С sed можно сделать что-то вроде этого со строкой:
echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*||"
и это даст мне 1234 в результате.
вы могли бы сделать то же самое с re.sub
функция, использующая то же регулярное выражение.
>>> re.sub(r'.*AAA(.*)ZZZ.*', r'', 'gfgfdAAA1234ZZZuijjk')
'1234'
в basic sed группа захвата представлена \(..\)
, но в python он был представлен (..)
.
вы можете найти первую подстроку с этой функцией в своем коде (по индексу символов). Кроме того, вы можете найти то, что находится после подстроки.
def FindSubString(strText, strSubString, Offset=None):
try:
Start = strText.find(strSubString)
if Start == -1:
return -1 # Not Found
else:
if Offset == None:
Result = strText[Start+len(strSubString):]
elif Offset == 0:
return Start
else:
AfterSubString = Start+len(strSubString)
Result = strText[AfterSubString:AfterSubString + int(Offset)]
return Result
except:
return -1
# Example:
Text = "Thanks for contributing an answer to Stack Overflow!"
subText = "to"
print("Start of first substring in a text:")
start = FindSubString(Text, subText, 0)
print(start); print("")
print("Exact substring in a text:")
print(Text[start:start+len(subText)]); print("")
print("What is after substring \"%s\"?" %(subText))
print(FindSubString(Text, subText))
# Your answer:
Text = "gfgfdAAA1234ZZZuijjk"
subText1 = "AAA"
subText2 = "ZZZ"
AfterText1 = FindSubString(Text, subText1, 0) + len(subText1)
BeforText2 = FindSubString(Text, subText2, 0)
print("\nYour answer:\n%s" %(Text[AfterText1:BeforText2]))
на всякий случай кто-то должен будет сделать то же самое, что и я. Мне пришлось извлечь все, что было в скобках, в линию. Например, если у меня есть строка типа " президент США (Барак Обама) встречался ... и я хочу получить только "Барак Обама" это решение:
regex = '.*\((.*?)\).*'
matches = re.search(regex, line)
line = matches.group(1) + '\n'
т. е. вам нужно заблокировать скобки с slash \
знак. Хотя это проблема о более регулярных выражениях, которые Python.
кроме того, в некоторых случаях вы можете увидеть символы 'r' перед регулярным выражением определение. Если нет префикса r, вам нужно использовать escape-символы, как в C. здесь более обсуждение этого.
вы можете сделать, используя только одну строку кода
>>> import re
>>> re.findall(r'\d{1,5}','gfgfdAAA1234ZZZuijjk')
>>> ['1234']
результат получит список...
в python извлечение строки формы подстроки можно сделать с помощью findall
метод в регулярном выражении (re
модуль).
>>> import re
>>> s = 'gfgfdAAA1234ZZZuijjk'
>>> ss = re.findall('AAA(.+)ZZZ', s)
>>> print ss
['1234']
одна строка, возвращающая другую строку, если совпадения не было. Edit: улучшенная версия использует