Сопоставьте фрагмент текста от начала до первого вхождения подстроки с несколькими символами - PullRequest
1 голос
/ 25 июня 2019

Я хочу, чтобы поиск по регулярному выражению заканчивался, когда он достигает ".", Но не когда он достигает ".";Мне известно об использовании [^...] для исключения отдельных символов, и я использовал это, чтобы остановить поиск, когда он достигает определенного символа.Это не работает со строками, так как [^. ] останавливается, когда достигает любого символа.Скажем, у меня есть код

import re

def main():
    my_string = "The value of the float is 2.5. The int's value is 2.\n"
    re.search("[^.]*", my_string)

main()

, который дает объект сопоставления со строкой

"The value of the float is 2"

Как я могу изменить это так, чтобы он останавливался только послестрока "."?

Дополнительный вопрос, есть ли способ сказать регулярному выражению, что нужно останавливаться, когда оно достигает одной из нескольких строк?Используя приведенный выше код в качестве примера, если бы я хотел, чтобы поиск заканчивался, когда он находил строку "." Или строку ". \ N", как бы я поступил?Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

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

^(.*?)\.\s

Если вы хотите, чтобы после точки ставился только пробел или символ новой строки, используйте любой из (второй вариант лучше, если у вас только один символ, используйте чередование, если есть альтернативы с несколькими символами)

^(.*?)\.(?: |\n)
^(.*?)\.[ \n]

См. Демоверсию regex .

Детали

  • ^ - начало строки
  • (.*?) - Захват группы 1: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • \. - литерал . символ
  • \s - символ пробела
  • (?: |\n) / [ \n] - группа без захвата, соответствующая пробелу или (|) символу новой строки.

Python demo :

import re

my_string = "The value of the float is 2.5. The int's value is 2.\n"
m = re.search("^(.*?)\.\s", my_string) # Try to find a match
if m:                                  # If there is a match
    print(m.group(1))                  # Show Group 1 value

ПРИМЕЧАНИЕ Если на входе могут быть разрывы строк, передайте флаг re.S или re.DOTALL:

m = re.search("^(.*?)\.\s", my_string, re.DOTALL)
0 голосов
/ 26 июня 2019

Помимо классического подхода, объясненного Wiktor, расщепление может быть интересным решением в этом случае.

>>> my_string
"The value of the float is 2.5. The int's value is 2.\n"
>>> re.split('\. |\.\n', my_string)
['The value of the float is 2.5', "The int's value is 2", '']

Если вы хотите включить точки в конце предложения, вы можете сделать что-то вроде этого:

['{}.'.format(sentence) for sentence in re.split('\. |\.\n', my_string) if sentence]

Для обработки нескольких пустых мест между предложениями:

>>> str2 = "The value of the float is 2.5.   The int's value is 2.\n\n  "
>>> ['{}.'.format(sentence) 
     for sentence in re.split('\. \s*|\.\n\s*', str2) 
     if sentence
     ]
['The value of the float is 2.5.', "The int's value is 2."]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...