Регулярное выражение для списка, разделенного символами ',' или 'и'

У меня есть длинный список цитат, для которых мне нужно извлечь полное имя каждого автора, год публикации, название и т. Д. Одна из цитат выглядит так:

Джо Боб, Джейн Доу и Джордж Х. Смит (2017). Название интересного отчета: Часть 2. Серии отчетов No. 101, Место для создания отчетов, Департамент составителей отчетов, город, провинция, страна, 44 страницы. ISBN: (печать) 123-0-1234-1234-5; (онлайн) 123-0-1234-1234-5.

И все цитаты оформляются одинаково. Часть, на которой я сейчас остановился, связана с извлечением полных имен авторов. Я читал здесь о том, как извлекать значения из списка, разделенного запятой, пробелом или точкой с запятой здесь, выполнив что-то вроде [\\s,;]+. Как бы я сделал что-то подобное для запятой или слова «и»?

Я предполагаю, что «и» нужно рассматривать как группу символов, поэтому я попытался [^,|[and])]+ сопоставить пробелы между , или набором символов [and], но это, похоже, не работает. Это question аналогичен тем, что имеет дело с запятой или пробелом, но решение включает в себя неявное удаление пробелов.

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

Джо Боб, Джейн Доу и Джордж Х. Смит

и каждое полное имя должно быть записано.


person pbreach    schedule 11.10.2017    source источник
comment
Я не уверен, что вы можете так упростить ввод. Вы можете попробовать ,\s*|\s+and\s+ или _ 2_, но в конечном итоге это может оказаться бесполезным. Просто к сведению: [and] соответствует одному символу, a, n или d. Чтобы соответствовать последовательности символов, вам необходимо записать их вне класса символов.   -  person Wiktor Stribiżew    schedule 11.10.2017
comment
Я думаю, что попытка создать одно регулярное выражение будет излишне сложной. Сначала я разделил бы струну на более мелкие части, а затем обработал бы каждую из них по отдельности. При таком подходе вы могли иметь дело только с упрощенным вводом в конце.   -  person Jared Goguen    schedule 11.10.2017
comment
@JaredGoguen Возможно, вы правы. То, что вы упомянули, было подходом, с которого я начал, но он выглядел беспорядочно, поэтому я подумал об использовании регулярного выражения. Другие детали цитаты уловить несложно, поэтому я подумал, что могу связать их вместе. Думаю, я пока буду придерживаться подхода разделения.   -  person pbreach    schedule 11.10.2017
comment
@pbreach Я думал об объединении этих двух, поэтому использовал регулярное выражение для разделения начальной цитаты на части, а затем использовал отдельные регулярные выражения для обработки каждой из этих частей.   -  person Jared Goguen    schedule 11.10.2017


Ответы (1)


Вот один из возможных подходов:

citation = """Joe Bob, Jane Doe and George H. Smith (2017). A title of an interesting report: Part 2. Report Series no. 101, Place for Generating Reports, Department of Report Makers, City, Province, Country, 44 pages. ISBN: (print) 123-0-1234-1234-5; (online) 123-0-1234-1234-5."""

citation = citation.replace(' and ', ',')
citation = citation[:citation.find('(')]

names = [name.strip() for name in citation.split(',')]

print names

Даю вам:

['Joe Bob', 'Jane Doe', 'George H. Smith']

Преобразуйте and в запятую, нарежьте до начала года и разделите запятыми.

Или в более компактном виде:

names = [name.strip() for name in citation[:citation.find('(')].replace(' and ', ',').split(',')]
person Martin Evans    schedule 11.10.2017