我有一个字符串,我想在括号前面找到一些单词。让我们说字符串是 -
'世界上有很多人患有结直肠癌(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;
}
}
导致正则表达式匹配如此大不相同(在它周围有不必要的括号,重复首字母缩略词等等。)
如何正确使用第一个正则表达式,以便我可以使用循环自动执行该过程,而不必每次都在正则表达式中输入确切的字符串?
答案 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
将返回匹配值。
还建议在定义正则表达式模式时使用原始字符串文字,以避免出现模糊不清的情况。