正则表达式查找&;用python替换电影名称
我一直在写关于不同电影的tweet(使用Twitter搜索API),现在我想用一个固定字符串替换匹配 我一直在与“圣诞启示录”斗争,因为有很多方法可以在推特上找到它。 我找了“X门启示录”,“X门启示录”,“X门启示录”,“X门”,“X门”,“X门”,它找到了我的匹配,其中还包括“@X门电影”,“\XMen”,,“X门:启示录”,等等 这是我的正则表达式:正则表达式查找&;用python替换电影名称,python,regex,twitter,replace,Python,Regex,Twitter,Replace,我一直在写关于不同电影的tweet(使用Twitter搜索API),现在我想用一个固定字符串替换匹配 我一直在与“圣诞启示录”斗争,因为有很多方法可以在推特上找到它。 我找了“X门启示录”,“X门启示录”,“X门启示录”,“X门”,“X门”,“X门”,它找到了我的匹配,其中还包括“@X门电影”,“\XMen”,,“X门:启示录”,等等 这是我的正则表达式: xmen_regex = re.compile("(((#)x[\-]?men:?(apocalypse)?)|(x[\-]? ?men[:
xmen_regex = re.compile("(((#)x[\-]?men:?(apocalypse)?)|(x[\-]? ?men[:]?[ ]?(apocalypse)?))")
def re_place_moviename(text, compiled_regex):
return re.sub(compiled_regex, "MOVIE_NAME", text.lower())
我已经用进行了测试,但在某些边缘情况下仍然不准确,例如:“#xmen blabla”->替换->“#MOVIE#NAME bla”或“MOVIE#namebala”
那么,有更好的方法吗?可能编译不同的正则表达式(在增加长度顺序(?)的基础上)并分别应用它
编辑
约束(或摘要):
(?:^|\s) : non capture group, begining of string or a space
# : #
x : x
[ -]? : optional space or dash
men : men
:? : optional semicolon
\s? : optional space
apocalypse : apocalypse
\b : word boundary
(?i)(
(?i)
——忽略案例标志
(?--no#
或@
在'xmen'之前
[-]?
--可选-
或
(?!:)
--在'xmen'后面没有冒号
(启示录)?
——可选启示录字符串
编辑:我认为有一个边界(\b
)更合适,而不需要在前面/后面留一个空格,也就是说,(?I)\b(?如“xmen”可能是句子的开头。这一个应该可以:
(?:^|\s)#x[ -]?men:?\s?apocalypse\b
更换时,如果您想保留之前的空间,请使用捕获组并将其放入更换零件中:
(^|\s)#x[ -]?men:?\s?apocalypse\b
说明:
(?:^|\s) : non capture group, begining of string or a space
# : #
x : x
[ -]? : optional space or dash
men : men
:? : optional semicolon
\s? : optional space
apocalypse : apocalypse
\b : word boundary
谢谢!我添加了一个摘要,很抱歉第一次没有这么具体:)我修改了(?I)\b(?谢谢!和我今天提到的一样。问题是,我使用的是re.sub(regx,'MOVIE')这个“非捕获组”,它仍然被替换。即“jaja#xmen jajaja”->jajajamoviejaja@OmarMiranda:您可以使用捕获组(^ |\s)
并将其添加到更换零件中。