Обновление 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.
Что здесь представляет собой \n
? Это новая строка или буквальное "\ n"?
@AhmedAbdelhameed разрыв строки
(?: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_]+
- одна или несколько букв.
Показать код. Очень важно, как вы применяете регулярное выражение.