我正在尝试使用正则表达式从包含多篇文章的文件中提取场地。我知道场地以For / From开头,然后是以一周中的某一天开始的日期或作者姓名(如果缺少日期),我写了以下正则表达式以匹配场地,但是它始终匹配所有内容直到作者姓名,这意味着如果该文章有日期,日期也会在场地中出现。
"""((?<=\n)(?:(?:\bFrom\b)|(?:\bFor\b)).*?(?=(?:(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)|(?:[A-Z]+))))""".r
为什么我的代码与遇到的日子不匹配,而是继续匹配作为作者姓名的[A-Z]。
输入:“各州之间敌对行动的后果
来自纽约包。
1787年11月20日,星期二。
HAMILTON
致纽约州人民:“
该行“1787年11月20日星期二”。是可选的,可能不会出现在所有文章中。我希望输出为“From the New York Packet”。 我收到了没有日期的文章的正确输出,但是我得到了输出“来自纽约包。
1787年11月20日,星期二。“对于包含日期的文章。
答案 0 :(得分:0)
根据您的编辑,您真正需要的是
^(From|For).*
带有多行标志。
我知道场地以For / From
开头,然后是日期,从一周中的某一天开始,如果日期缺失则由作者姓名开头
它始终匹配所有内容,直到作者姓名,这意味着如果该文章有日期,日期也会在场地中出现。
听起来你想在文本文件中找到以“From”或“For”开头的整行
^(From|For)
(设置多行标志,以便^
匹配行的开头而不是输入的开头。)
后面是可选日期
\s+(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)?
后跟作者姓名
\s+\w+\s+\w+
然后是一切,直到行尾
.*
除非当然,否则您的意思是要跳过日期并仅匹配For / From和作者姓名(而不是日期)。仅在Regex中无法完成 - 但您可以使用分组来提取所需的值。
答案 1 :(得分:0)
您只需要捕获以For或From开头的整行,这样您就可以使用它:
^(For|From).*$
^和$将匹配锚定到行的开头和结尾,而。*匹配中间的所有内容。
此处,try it out包含您喜欢的任何示例。
如果这需要更复杂,我会更新我的答案。