为什么添加空格会使我的正则表达式出错?

2024-05-14 22:00:48 发布

您现在位置:Python中文网/ 问答频道 /正文

(^\s*\d+\)(.*) | ) | (^\s*Q\d+\.\s*(.*))

上面的正则表达式与Q1. qeqwewqeqeq qerqer不匹配

但是如果我去掉|前后的空白

(^\s*\d+\)(.*) | )|(^\s*Q\d+\.\s*(.*))

它和我的线吻合。你知道吗

空白是什么意思?它等于\s吗?它影响我的可读性。你知道吗


Tags: 空白可读性q1qerqerqeqwewqeqeq
3条回答

是的,空格会影响正则表达式。不,它不等于\s。你知道吗

\sshorthand character class等价于字符类[ \t\r\n\f],即匹配任何空白字符的字符类。因此,虽然格式化空间包含在\s中,但它们并不是等价的。你知道吗

正如在评论中所说的,文本空白在正则表达式中很重要。事实上,我相信这会导致您的第一个备选方案出现错误(子模式(^\s*\d+\)(.*) | ))。你知道吗

如果我读对了子模式的意图,它应该匹配表单的文本

2) some_text

但它会:

  1. 仅在后跟空格时匹配此文本
  2. 也匹配单个文字空间

构造此子模式的更好方法是(^\s*\d+\)(.*)),将结束空间和交替一起处理。此外,为了提高可读性,我们可以这样做:

(^\s*(?:Q\d+\.|\d+\))\s*(.*))

它只在问题编号格式上交替出现,而不是整个模式。你知道吗

Demo on Regex101

正则表达式的内容100%适用于确定输入是否匹配。你的想象力不会改变正则表达式的处理。你知道吗

正则表达式“\dignore this part\d”将与输入“12”不匹配,但与输入“1ignore this part2”匹配。不管在想象中“忽略这部分”会被跳过多少,它仍然是正则表达式的一部分。你知道吗

在你的例子中,多余的空格是“忽略这部分”的形式。你知道吗

在正则表达式模式中,空间是与空间匹配的有意义的原子。如果您需要使用空格、制表符和换行符格式化您的模式—使用正则表达式引擎不会考虑的空格—您可以使用(?x)修饰符或^{}标志。你知道吗

然后,要用(?x)选项匹配这种模式中的文本空间,需要转义空间来匹配文本空间。或者,您可以考虑将任何空格与\s匹配:

\s  A whitespace character: [ \t\n\x0B\f\r]

注意,如果添加(?U)修饰符,^{}标志,\s将匹配所有Unicode空白(如[\p{Zs}\t\r\n])。你知道吗

相关问题 更多 >

    热门问题