RegEx для сопоставления слова, за которым следует косая черта и 10 цифр - PullRequest
1 голос
/ 17 мая 2019

У меня есть строка, в которой я пытаюсь найти все строки, которые начинаются с mystring/ и заканчиваются 10-значным идентификационным номером.Я хотел бы вывести список всех этих идентификаторов с прикрепленной строкой.

Я действительно не знаю регулярных выражений, но я предполагаю, что это библиотека для использования здесь.Я начал это ниже:

import re
source = 'mystring/1234567890 hello world mystring/2345678901 hello'
re.findall("mystring/",source)

Ответы [ 3 ]

1 голос
/ 26 мая 2019

Здесь мы будем использовать две группы захвата и извлекать обе mystring с, с и без идентификаторов:

(mystring\/([0-9]{10}))

Тест

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

import re

regex = r"(mystring\/([0-9]{10}))"

test_str = "hello mystring/1234567890 hello world mystring/2345678901 hellomystring/1234567890 hello world mystring/2345678901 hello"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

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

enter image description here

RegEx

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

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

Demo

const regex = /(mystring\/([0-9]{10}))/gm;
const str = `hello mystring/1234567890 hello world mystring/2345678901 hellomystring/1234567890 hello world mystring/2345678901 hello`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
1 голос
/ 27 мая 2019

Вы можете использовать границу слова \b, чтобы не допустить, чтобы mystring была частью большего слова, а затем сопоставить косую черту с 10 цифрами \d{10}, используя квантификатор :

\bmystring/\d{10}

Regex demo | Python demo

Например:

import re
source = 'mystring/1234567890 hello world mystring/2345678901 hello'
print(re.findall(r"\bmystring/\d{10}",source))

Результат:

['mystring/1234567890', 'mystring/2345678901']

Если вы хотите перечислить только цифры, в качестве альтернативы вы можете использовать позитивный вид сзади:

(?<=\bmystring/)\d{10}(?!\S)
  • (?<=\bmystring/) Позитивный взгляд за спиной, утверждаю, что слева находится мистическая строка
  • \d{10} соответствует 10 цифрам
  • (?!\S) Отрицательный взгляд, утверждающий, что прямо справа, не является символом без пробела

Regex demo | Python demo

0 голосов
/ 26 мая 2019

Вы можете использовать

r"\bmystring/(\d{10})(?!\d)"

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

Подробности

  • \bmystring/ - граница слова, которая соответствует только mystring как целому слову с / в конце
  • (\d{10}) - группа захвата # 1: 10 цифр
  • (?!\d) - нетс последующей другой цифрой.

Демонстрация Python :

import re
source = 'mystring/1234567890 hello world mystring/2345678901 hello'
matches = re.finditer(r"\bmystring/(\d{10})(?!\d)", source)
for match in matches:
    print("Whole match: {}".format(match.group(0)))
    print("Group 1: {}".format(match.group(1)))

Вывод:

Whole match: mystring/1234567890
Group 1: 1234567890
Whole match: mystring/2345678901
Group 1: 2345678901

Или используйте просто

print(re.findall(r"\bmystring/(\d{10})(?!\d)", source))

, который выведет список идентификаторов: ['1234567890', '2345678901'].

...