【问题标题】:matching any character including newlines in a Python regex subexpression, not globally匹配任何字符,包括 Python 正则表达式子表达式中的换行符,而不是全局匹配
【发布时间】:2016-01-23 13:41:40
【问题描述】:

我想使用re.MULTILINE,但NOT re.DOTALL,这样我就可以拥有一个既包含“任何字符”通配符又包含不包含的普通. 通配符的正则表达式匹配换行符。

有没有办法做到这一点?在我想包含换行符的情况下,我应该使用什么来匹配任何字符?

【问题讨论】:

  • 只需执行[\s\S][\w\W] 之类的操作
  • [^\r\n] == 除了 CR/LF
  • 嗨,Jason,除非我遗漏了什么,否则标签中可以隐含“python”+“regex”,因此不需要在标题中指定(根据“标题中没有标签" 准则)?
  • 因为 SO 的相关问题列表不包括标签所以上下文信息很重要。
  • “标题中没有标签”要么需要成为指南(不是要求),要么需要重新审视,或者 SO 需要开始在相关问题列表中显示标签。

标签: python regex


【解决方案1】:

要匹配没有re.S/re.DOTALL 的换行符或“任何符号”,您可以使用以下任何一种:

  1. (?s:.) - 带有s 标志的inline modifier group 设置一个范围,其中所有. 模式匹配任何字符,包括换行字符

  2. 以下任何解决方法:

[\s\S]
[\w\W]
[\d\D]

主要思想是字符类中相反的速记类匹配输入字符串中的任何符号。

将它与(.|\s) 和其他带有交替的变体进行比较,字符类解决方案的效率要高得多,因为它涉及的回溯要少得多(当与*+ 量词一起使用时)。比较小例子:完成(?:.|\n)+ 需要45 步,而[\s\S]+ 只需2 步。

查看Python demo,其中我匹配以123 开头的行,直到行首第一次出现3,包括该行的其余部分:

import re
text = """abc
123
def
356
more text..."""
print( re.findall(r"^123(?s:.*?)^3.*", text, re.M) )
# => ['123\ndef\n356']
print( re.findall(r"^123[\w\W]*?^3.*", text, re.M) )
# => ['123\ndef\n356']

【讨论】:

  • 太棒了,谢谢!我知道有办法做到这一点,但不记得了。
  • 修正了一些错别字。对不起他们。
  • @IoannisFilippidis 您建议使用正则表达式选项来匹配任何字符。这超出了当前的帖子范围,因为 OP 知道正则表达式选项,re.Mre.S/re.DOTALL,但想知道如何在没有标志的情况下做到这一点。此外,re.MULTILINE 是匹配 Python re 中任何字符的错误标志,因为它仅修改 ^$ 锚的行为,而 re.Sre.DOTALL 使 . 匹配任何字符,包括换行符。
  • @WiktorStribiżew 在您的个人资料中添加指向此答案的链接,其中包含文本“永远不要使用(.|\n)!!!”对像我这样的正则表达式爱好者很有用。
【解决方案2】:

匹配任意字符(包括换行符):

正则表达式:(注意空格''的使用也有)

[\S\n\t\v ]

示例:

import re

text = 'abc def ###A quick brown fox.\nIt jumps over the lazy dog### ghi jkl'
# We want to extract "A quick brown fox.\nIt jumps over the lazy dog"
matches = re.findall('###[\S\n ]+###', text)
print(matches[0])

“matches[0]”将包含:
'一只敏捷的棕色狐狸。\n它跳过了那只懒狗'

'\S' Python 文档说明:

\S 匹配任何不是空白字符的字符。

(参见:https://docs.python.org/3/library/re.html#regular-expression-syntax

【讨论】:

  • 这与\t\v 不匹配。
  • \v 不是偶尔使用的,但我还是包含了它。问题说要匹配“包括换行符在内的任何字符”。所以不管对他有用:-) @ApproachingDarknessFish
猜你喜欢
  • 2012-01-08
  • 1970-01-01
  • 2017-02-26
  • 2014-06-30
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多