用Python正则表达式匹配字符串直到行末

8 投票
3 回答
25431 浏览
提问于 2025-04-17 01:56

如果我有一个很长的字符串,里面有多行内容,我想只匹配某一行的部分内容到这一行的结尾,最好的方法是什么呢?

举个例子,我有这样的内容,我希望在遇到换行符的时候就停止匹配。

r"(?P<name>[A-Za-z\s.]+)"

我在一个之前的回答中看到过这个:

$ - 表示匹配到字符串的末尾,或者如果启用了多行模式,则表示匹配到行的末尾。

那么我的问题是,如何像那个回答的作者说的那样“启用多行模式”呢?

3 个回答

1

看看 flags 这个参数,详细信息可以在这个链接找到:http://docs.python.org/library/re.html#module-contents

2

你可以通过在调用 re.compile() 时传入 re.MULTILINE 作为第二个参数来启用多行匹配。不过,有一点需要注意:因为 + 这个符号是贪婪的,它会尽可能匹配最长的字符串,所以如果下一行是由字母和空格组成的,正则表达式可能会匹配到多行内容($ 是用来匹配任何字符串的结尾)。

解决这个问题有三种方法:

  1. 修改你的正则表达式,让它在匹配空白字符时不包括换行符(\s),这样你的重复字符集就不会匹配到换行符。
  2. 把量词改成 +?,这是 + 的非贪婪(“最小”)版本,这样它就会尽量匹配最短的字符串,从而在第一个换行符处停止。
  3. 先把文本按行分开,变成每行一个字符串(使用 text.split('\n'))。
12

简单来说,你可以使用

r"(?P<name>[A-Za-z\t .]+)"

这个方法会匹配ASCII字母、空格、制表符或者句点。它会在遇到第一个不在这个组里的字符时停止匹配——换句话说,换行符不在这个组里(而换行符是包含在\s里的,所以无论多行模式是否开启,这个都没关系)。

撰写回答