Regex для извлечения всего текста в строке, если конкретный шаблон соответствует - PullRequest
0 голосов
/ 19 июня 2019

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

1. 7.2.S.6.4 ANNOTATED DATA 
    OR
2. 9-2-K-1-4 FILE DATA
    OR
3. 2-2.K-4.3 FOLDER DATA

В каждом из этих случаев я хочу получить в качестве вывода:

  1. АННОТИРОВАННЫЕ ДАННЫЕ
  2. ДАННЫЕ ФАЙЛА
  3. ДАННЫЕ ПАПКИ

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

До сих пор я использовал регулярное выражение

\s*(-?\d+(?:\.\d+)?)

, но оно не соответствует .S.или -K- часть в шаблоне.Любая идея, как это исправить

Ответы [ 3 ]

0 голосов
/ 19 июня 2019

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

^(\d\.) \S+(.*)

, а затем получить содержимое из групп захвата 1 и 2

Regex demo

Кроме того, вы можете использовать это регулярное выражение с $1$2 в качестве строки замены:

^(\d\.) \S+(.*)|.+

Regex demo

Пример кода

import re

regex = r"^(\d\.) \S+(.*)|.+"

test_str = ("1. 7.2.S.6.4 ANNOTATED DATA \n"
    "    OR\n"
    "2. 9-2-K-1-4 FILE DATA\n"
    "    OR\n"
    "3. 2-2.K-4.3 FOLDER DATA")

subst = "$1$2"

# 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)
0 голосов
/ 19 июня 2019

Эти выражения, вероятно, могут работать здесь,

(?=[0-9]+[.-][0-9]+[.-][A-Z]+[.-][0-9]+[.-][0-9]+).*[0-9]\s(.+)
(?=[0-9]+[.-][0-9]+[.-][A-Z]+[.-][0-9]+[.-][0-9]+).*[0-9]\s+(.+)

Это отделение гарантирует, что у нас будет правильный рисунок

(?=[0-9]+[.-][0-9]+[.-][A-Z]+[.-][0-9]+[.-][0-9]+)

и здесь мы бы захватили желаемый результат

(.+)

Демо 1

Демо 2

TEST

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

import re

regex = r"(?=[0-9]+[.-][0-9]+[.-][A-Z]+[.-][0-9]+[.-][0-9]+).*[0-9]\s(.+)"

test_str = ("7.2.S.6.4 ANNOTATED DATA\n"
    "9-2-K-1-4 FILE DATA\n"
    "2-2.K-4.3 FOLDER DATA")

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.
0 голосов
/ 19 июня 2019

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

\s*([-.]?\d+(?:\.\d+)?([-.][A-Z])?)[ ](.*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...