%s在正则表达式中显示奇怪的行为

时间:2016-10-18 13:08:36

标签: python regex

我有一个字符串,我想在括号前面找到一些单词。让我们说字符串是 -

  

'世界上有很多人患有结直肠癌(crc),他们也患有抑郁症(ds)'

我想在括号前最多抓取5个单词。我在括号内有一个[(crc), (ds)]缩写列表 - acrolen=5 rt=[] for acro in acronym_list: find_words= re.findall('((?:\w+\W+){1,%d}%s)' %(acrolen, acro), text, re.I) for word in find_words: rt.append(word) print rt 。所以我使用以下代码 -

('the world having colorectal cancer (crc', 'crc')
('also have the depression syndrome (ds', 'ds')

但这会给出这个结果 -

find_words= re.findall('((?:\w+\W+){1,%d}\(crc\))'  %(acrolen),s, re.I)

然而,如果我使用正则表达式 -

the world having colorectal cancer (crc)

然后它能够​​找到我想要的东西,即 -

%s

问题是 - 为什么在字符串中使用$user-card-width: 300px; $user-card-height: 130px; .user-card{ height: $user-card-height; width: $user-card-width; max-width: $user-card-width; overflow: hidden; .card-block{ padding: 0rem 1.25rem; } .user-card-image{ padding-right: 15px; display: table-cell; vertical-align: middle; height: $user-card-height; } .user-card-content{ display: table-cell; vertical-align: middle; height: $user-card-height; } :hover{ background-color: $gray-lightest; cursor: pointer; } }导致正则表达式匹配如此大不相同(在它周围有不必要的括号,重复首字母缩略词等等。)

如何正确使用第一个正则表达式,以便我可以使用循环自动执行该过程,而不必每次都在正则表达式中输入确切的字符串?

1 个答案:

答案 0 :(得分:1)

您需要确保传递的变量正确转义,以便在正则表达式模式中用作文字文本。使用re.escape(acro)

import re
text = "there are many people in the world having colorectal cancer (crc) who also have the depression syndrome (ds)"
acrolen=5
rt=[]
acronym_list = ["(crc)", "(ds)"]
for acro in acronym_list:
    p = r'((?:\w+\W+){1,%d}%s)' %(acrolen, re.escape(acro))
    # Or, use format:
    # p = r'((?:\w+\W+){{1,{0}}}{1})'.format(acrolen, re.escape(acro))
    find_words= re.findall(p, text, re.I)
    for word in find_words:
        rt.append(word)
print rt

请参阅Python demo

另外,请注意,您不需要使用捕获组封装整个模式,如果模式中未定义捕获组,re.findall将返回匹配值。

还建议在定义正则表达式模式时使用原始字符串文字,以避免出现模糊不清的情况。