2015-11-20 2 views
2

Как я могу получить строку, встроенную в {} после ключевого слова, где количество символов между ключевым словом и фигурными скобками {} неизвестно. .: напримерпоиск строки, встроенной в {} после ключевого слова

includegraphics[x=2]{image.pdf} 

ключевое слово будет includegraphics и строка быть найден image.pdf, но текст между [x=2] может иметь что-либо между двумя []. Поэтому я хочу, чтобы игнорировать все символы между ключевым словом и { или я хочу, чтобы игнорировать все между []

+0

Я действительно не понимаю, что вы хотите сделать. Если вы просто хотите извлечь image.pdf, вы можете использовать indexOf. – JonathanG

ответ

2

Использование re.findall

>>> sample = 'includegraphics[x=2]{image.pdf}' 
>>> re.findall('includegraphics.*?{(.*?)}',sample) 
['image.pdf'] 

Объяснение:

re module имеет дело с регулярными выражениями в Python. Его метод findall полезен для поиска всех вхождений шаблона в строке.

Регулярное выражение для картины, которую вас интересует, это 'includegraphics.*?{(.*?)}'. Здесь . символизирует «любой символ», а * означает 0 или более раз. Вопросительный знак делает это ненасытной операцией. Из документации:

В *, + и ? отборочные все жадные; они соответствуют максимально возможному числу . Иногда такое поведение нежелательно; если RE <.*> соответствует <H1\>title</H1>, он будет соответствовать всей строке , а не только <H1>. Добавление ? после того, как квалификатор делает его выполняет матч в неживой или минимальной моде; так как количество символов возможно будет соответствовать. Использование .*? в предыдущем выражении будет соответствует только <H1>.

Пожалуйста, обратите внимание, что если в вашем случае, используя .*? должно быть хорошо, в общем, лучше использовать более специализированные группы символов, такие как \w для буквенно-цифровых символов и \d для цифр, когда вы знаете, что содержание будет состоять из заранее.

+0

Или лучше, используйте метод [* unrolling the loop *] (http://www.softec.lu/site/RegularExpressions/UnrollingTheLoop), который позволит вам обрабатывать очень большие входные тексты. Однако что-то заставляет меня думать, что отрицательные классы персонажей должны работать намного лучше здесь. Посмотрите на ['includegraphics [^ {] * {([^}] *)}'] (https://regex101.com/r/lO5aJ7/1). –

0

Использование re.search

re.search(r'includegraphics\[[^\[\]]*\]\{([^}]*)\}', s).group(1) 
Смежные вопросы