Regex удаляет 'by' из строки

Обновление 2: https://regex101.com/r/bE5aWW/2

Обновление: это то, что я могу придумать, https://regex101.com/r/bE5aWW/1/, но мне нужна помощь, чтобы избавиться от .

Дело 1

\n                                \n                                   by name name\n                                \n                            

Случай 2

\n                                \n                                   name name\n                                \n     

Случай 3

by name name

Случай 4

name name

Я хотел бы выбрать часть имени из приведенных выше строк, то есть name name. Тот, который я придумал, (?:by)? ([\w ]+) не работает, когда перед by есть пробелы.

Спасибо

Коды от regex101

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

import re

regex = r"(?:by)? ([\w ]+)"

test_str = ("\\n                                \\n                                   by Ally Foster\\n                                \\n                            \n\n"
    "\\n                                \\n                                   Ally Foster\\n                                \\n                            \n\n"
    "by name name\n\n"
    "name name")

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

for matchNum, match in enumerate(matches):
    matchNum = matchNum + 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.

Показать код. Очень важно, как вы применяете регулярное выражение.

Mad Physicist 10.09.2018 04:13

Что здесь представляет собой \n? Это новая строка или буквальное "\ n"?

41686d6564 10.09.2018 04:16

@AhmedAbdelhameed разрыв строки

Harrison 10.09.2018 04:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

(?:by )?(\b(?!by\b)[\w, ]+\S)

Моя последняя версия, которая также не выбирает строки, имеет только by

Ответ принят как подходящий

Я предлагаю использовать

re.findall(r'\b(?!by\b)[^\W\d_]+(?: *(?:, *)?[^\W\d_]+)*', s)

См. демонстрация регулярного выражения. В Python 2 вам нужно будет передать флаг re.U, чтобы все классы сокращенных символов и границы слова знали Unicode. Чтобы также сопоставить табуляции, а не просто пробелы, замените пробелы на [ \t].

Подробности

  • \b - граница слова
  • (?!by\b) - следующее слово не может быть by
  • [^\W\d_]+ - одна или несколько букв
  • (?: *(?:, *)?[^\W\d_]+)* - группа без захвата, которая соответствует 0 или более вхождениям:
    • * - ноль или более пробелов
    • (?:, *)? - необязательная последовательность пробелов , и 0+
    • [^\W\d_]+ - одна или несколько букв.

Другие вопросы по теме