Как получить подходящее слово из объекта соответствия регулярному выражению после использования finditer - PullRequest
1 голос
/ 10 июня 2019

Я сделал этот шаблон, чтобы получить ссылку на ссылку в блоге (которая может быть разделена дефисами или подчеркиванием и т. Д. В URL моих сайтов, чтобы сопоставить ее с базой данных и отобразить соответствующую запись). Всякий раз, когда я добавляю совпадения в список, все они являются объектами повторного совпадения. Как мне получить подходящее слово?

Я пытался использовать поиск и сопоставление, но они не возвращают отдельное слово.

import re
pattern = r"[a-zA-Z0-9]+[^-]+"
matches = re.finditer(pattern, "this-is-a-sample-post")
matches_lst = [i for i in matches]

Итак, предположим, что у меня есть строка "this-is-a-sample-post", я хочу получить "this the sample post".

Мне нужен список совпавших слов, чтобы я мог использовать метод "" .join () и сопоставить строку с моей базой данных.

Ответы [ 5 ]

1 голос
/ 10 июня 2019
import re
pattern = r"[a-zA-Z0-9]+[^-]+"
string = "this-is-a-sample-post"
matches = re.finditer(pattern, string)
matches_lst = [i.group(0) for i in matches]
print("Made with finditer:")
print(matches_lst)
print("Made with findall")
matches_lst = re.findall(pattern, string)
print(matches_lst)
print("Made with split")
print(string.split("-"))
print("Made with replace and split")
print(string.replace("-"," ").split())

Выход: >>>

Made with finditer:
['this', 'is', 'sample', 'post']
Made with findall
['this', 'is', 'sample', 'post']
Made with split
['this', 'is', 'a', 'sample', 'post']
Made with replace and split
['this', 'is', 'a', 'sample', 'post']
>>> 
1 голос
/ 10 июня 2019

Заменить:

matches_lst = [i for i in matches]

На:

matches_lst = [i.group(0) for i in matches]

Или вы можете просто использовать findall, который даст вам список:

matches = re.findall(pattern, "this-is-a-sample-post")
0 голосов
/ 10 июня 2019

Из текущего шаблона регулярного выражения (r "[a-zA-Z0-9] + [^ -] +") он выберет только "это образец сообщения" и пропустит "a". потому что здесь он ищет один или несколько символов.

Чтобы получить полное предложение, измените шаблон на

r'[a-zA-Z0-9]*[^-]'

Вы можете сделать это 3 способами:

  1. Использование re.sub для замены "-" на "" (пробел)
>>> re.sub("-", " ", "this-is-a-sample-post")

O/P: 'this is a sample post'
  1. Извлеките выходные данные finditer () в список и выполните объединение.
>>> text = "this-is-a-sample-post"
>>> a = [m.group(0) for m in re.finditer(r'[a-zA-Z0-9]*[^-]', text)]
>>> " ".join(a)

o / p: «Это образец сообщения»

  1. Получить вывод в строку и заменить '-' пробелом
str = "this-is-a-sample-post"
str.replace('-', ' ')

o / p: «Это образец сообщения»

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

Как предлагается в комментарии, также re.sub является решением:

import re

s = 'this-is-example'
s = sub('-', ' ', s)

Наивный str.replace тоже работает:

s = 'this-is-example'
s = s.replace('-', ' ')
0 голосов
/ 10 июня 2019

Я предполагаю, что мы могли бы также немного изменить наше выражение в вопросе, если мы хотим зафиксировать слова, а не тире:

Демо

Тест

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

import re

regex = r"([a-zA-Z0-9]+)"

test_str = "this-is-a-sample-post"

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...