Соответствие регулярному выражению Python перед персонажем и игнорирование пробелов

Я пытаюсь написать регулярное выражение для соответствия части строки, которая идет перед '/', но также игнорирует любые пробелы в начале или в конце совпадения.

До сих пор у меня есть ^[^/]* который соответствует всему до '/', но я не могу понять, как игнорировать пробел.

      123 / some text 123

должен уступить

123

а также

     a test / some text 123

должен уступить

a test

Всего 4 ответа


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

S.*?(?= */)

Смотрите демо здесь

Если косая черта может быть первым непробельным символом во входной строке, замените S на [^s/] :

[^s/].*?(?= */)

Вот возможное решение

Regex

(?<!/)S.*S(?=s*/)

пример

# import regex # or re

string = ' 123 / some text 123'
test = regex.search(r'(?<!/)S.*S(?=s*/)', string)
print(test.group(0))
# prints 飓'

string = 'a test / some text 123'
test = regex.search(r'(?<!/)S.*S(?=s*/)', string)
print(test.group(0))
# prints 'a test'

Краткое объяснение

  • (?<!/) говорит, что перед возможным совпадением не может быть символа / .
  • S.*S лениво сопоставляет что-либо ( .* ), Следя за тем, чтобы оно не начиналось и не заканчивалось пробелом ( S )
  • (?=s*/) означает, что за возможным совпадением должен следовать символ / или пробелы + a / .

Вы можете сделать это без регулярных выражений

my_string = "      123 / some text 123"
match = my_string.split("/")[0].strip()

Это выражение - то, что вы можете изучить:

^(.*?)(s+/.*)$

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

(.*?)(s+/.*)

Python Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"^(.*?)(s+/.*)$"

test_str = ("123 / some text 123
"
    "anything else    / some text 123")

subst = "\1"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

JavaScript Demo

 const regex = /^(.*?)(s+/.*)$/gm; const str = `123 / some text 123 anything else / some text 123`; const subst = `
$1`; // The substituted value will be contained in the result variable const result = str.replace(regex, subst); console.log('Substitution result: ', result); 

RegEx

Если это не было вашим желаемым выражением, вы можете изменить / изменить выражения в regex101.com .

введите описание изображения здесь

RegEx Circuit

Вы также можете визуализировать ваши выражения в jex.im :

введите описание изображения здесь

пространства

Для пробелов перед желаемым выводом мы можем просто добавить группу захвата с отрицательным внешним видом :

 ^(s+)?(.*?)(s+/.*)$

JavaScript Demo

 const regex = /^(s+)?(.*?)(s+/.*)$/gm; const str = ` 123 / some text 123 anything else / some text 123 123 / some text 123 anything else / some text 123`; const subst = `$2`; // The substituted value will be contained in the result variable const result = str.replace(regex, subst); console.log('Substitution result: ', result); 

демонстрация

введите описание изображения здесь


Есть идеи?

10000