在正则表达式中前瞻

时间:2013-02-07 20:26:25

标签: regex lookahead

我正在尝试使用正则表达式从包含多篇文章的文件中提取场地。我知道场地以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日,星期二。“对于包含日期的文章。

2 个答案:

答案 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包含您喜欢的任何示例。

如果这需要更复杂,我会更新我的答案。