我正在尝试编写一个正则表达式来解析这样一段(看似非常简单)的文本。
some stuff
First name: John
Last name: Smith
more stuff
我想捕获名字和姓氏,所以我尝试了这样的正则表达式:
(?<=First name:\s*)(?<FirstName>\w+)(?<=\s*Last name:\s*)(?<LastName>\w+)
找不到匹配项。每个部分(名字和姓氏)都是单独工作的,但它们不能一起工作。此外,以下工作
(?<=John\s*Last name:\s*)(?<LastName>\w+)
但当我将“John”移出非匹配组时......
John(?<=\s*Last name:\s*)(?<LastName>\w+)
......它不匹配!
我在这里做错了什么?
答案 0 :(得分:1)
由于后视断言是零宽度(即它们不消耗任何字符),FirstName捕获将匹配/捕获“名字:”之后的任何内容,在本例中为“John”。在第一次匹配之后,目标字符串中的位置将紧跟在“John”之后。但由于正则表达式的下一部分是另一个后视,正则表达式将查看紧接其当前位置之前的内容是否与您的后置文本相匹配,在本例中为“姓氏:”。因为它实际上是以“John”开头,所以整个正则表达式都失败了,甚至连“史密斯”都没有。
答案 1 :(得分:0)
刚才意识到我可能不需要后视,因为以下工作:
First name:\s*(?<FirstName>\w+)\s*Last name:\s*(?<LastName>\w+)
尽管如此,我有兴趣知道为什么它不适用于后视以供将来参考。
答案 2 :(得分:0)
我认为您需要确保换行符与您正在使用的正则表达式语言匹配。
在Python中,这意味着将re.DOTALL
传递给re.compile()
或您正在使用的re
函数。在Perl中,在最后一个斜杠后添加s
。