所以我有一些文档要从中提取日期,我的正则表达式为:
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
答案 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})"
禁止换行(请记住,您不能缩进第一行以下的行,因为这些空格/制表符将包含在字符串中):
\