正则表达式|多线故障python

时间:2019-05-22 18:40:39

标签: python regex

所以我有一些文档要从中提取日期,我的正则表达式为:

query = """([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril
    |[mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary
    |[nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept
    |[oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})"""

OR

query = """([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril|
    [mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary|
    [nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept|
    [oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})"""

两者之间的唯一区别是,一个在每行的开头都带有|,另一个在新行的末尾带有|。这两个匹配不同的事物-特别是|在行的末尾,我将不匹配五月,但是如果在行的开始,我将不匹配一月(假设一天的其余时间和yr和空格是正确的,我实际上只是将或位置移动而我刚刚匹配的内容就不再匹配,反之亦然)。我是否以某种方式做错了什么,有没有解决的办法,还是有正确的办法做呢?显然,目标是两者都匹配。如果您想自己尝试一下,我可以轻松复制的案例是“ 2018年5月8日”和“ 2018年1月25日”。

我剩下的代码只是re.search(query,doc)(这是无法匹配的东西)。

注意-python 3.6.8 regex == 2018.1.10

2 个答案:

答案 0 :(得分:1)

正如一些人在评论中提到的那样,您应该尝试re.X (or re.VERBOSE)

这将使您既可以将正则表达式放在多行上,也可以包含注释

query = """
# Day
([0-9]{1,2})?
\s{1,2}
# Long month
([jJ]anurary|[fF]eburary|[mM]arch
|[aA]pril|[mM]ay|[jJ]une
|[jJ]uly|[aA]ugust|[sS]eptember
|[oO]ctober|[nN]ovember|[dD]ecember
# Short month
|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug
|[sS]ept?|[oO]ct|[nN]ov|[dD]ec)
\s{1,2}
# Year
([0-9]{2,4})"""

这对于将正则表达式分离和记录为更易于管理的部分很有用。

此外,如果多次使用正则表达式,您可能希望对其进行编译。因此,您可以像pattern = re.compile(query, re.X)pattern = re.compile(query, re.VERBOSE)那样使用它。

答案 1 :(得分:0)

输入带三引号的字符串时,会记录三引号内的所有字符,包括包括 const tags = [ ':="web_DB".outtag1:', ':="web_DB".outtag2:', //... ':="web_DB".outtag10:' ]; window.onload = function() { for (let i = 0; i <= 9; i++) { const color = (tags[i] == 1) ? 'green' : 'red'; document.getElementById('button' + (i+1)).style.backgroundColor = color; } } 。这就是您的查询字符串的真正外观:

\n

通过使用>>> query = """([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril| ... [mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary| ... [nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept| ... [oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})""" >>> query '([0-9]{1,2})?\\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril|\n [mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary|\n [nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept|\n [oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\\s{1,2}([0-9]{2,4})' 行继续来在多行中输入字符串来避免这种情况:

\

您还可以保留三引号并用query = r"([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril|[mM]ay|[jJ]une|[jJ]uly|[aA]ugust|" \ r"[sS]eptember|[oO]ctober|[jJ]anuary|[nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|" \ r"[sS]ept|[oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})" 禁止换行(请记住,您不能缩进第一行以下的行,因为这些空格/制表符将包含在字符串中):

\

另请参阅:Pythonic way to create a long multi-line string