Соответствие регулярному выражению Python перед персонажем и игнорирование пробелов - PullRequest
6 голосов
/ 17 мая 2019

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

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

      123 / some text 123

должно дать

123

и

     a test / some text 123

должен дать

a test

Ответы [ 4 ]

4 голосов
/ 18 мая 2019

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

\S.*?(?= *\/)

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

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

[^\s\/].*?(?= *\/)
3 голосов
/ 17 мая 2019

Вы можете захотеть изучить это выражение:

^(.*?)(\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\n"
    "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 = `\n$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 .

enter image description here

RegEx Circuit

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

enter image description here

Пробелы

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

 ^(\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);

Демо

enter image description here

2 голосов
/ 18 мая 2019

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

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 '123'

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

Shortобъяснение

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

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

my_string = "      123 / some text 123"
match = my_string.split("/")[0].strip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...