我一直在写关于不同电影的推文(使用),现在我想用一个固定的字符串替换匹配。
我一直在与"XMen启示录“作斗争,因为有很多方法可以在推特上找到这一点。我查找了“X战警启示录”,“X战警启示录”,"X战警启示录“,"XMen",”X战警“e 29,E 110”X Men“E 211,并检索了我的匹配项,其中还包括E 114”#xmen“E 215、E 116”x-men: apocalypse"等等……
这是我的准则:
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())我已经用RegExr进行了测试,但在某些边缘情况下仍然不准确,比如:'#xmen blabla‘->代替-> '#MOVIE_NAME blabla’或‘->_NAMEblabla’。
那么,有更好的方法来做这个吗?可能编译不同的正则表达式(关于增加长度顺序(?))单独应用吗?
编辑
约束(或摘要):
我要找到"x-men","x men","xmen“所有1+“启示录”所有1+ ":启示录“还有:"#xmen","#x-men",“#xmena便耳”,“#x-启示”所有不应该是子字符串("@xmenmovie“或"lovexmen”),必须在表达式的开头和结尾至少包含一个空格。PS:其他电影比较容易,但是xmen和其他像Rogue这样的电影有很多表达方式,我们想抓住其中的大部分。
PS1:我知道\b可以帮上忙,但我不明白它是如何工作的。
发布于 2017-01-05 16:39:02
这个人应该做好以下工作:
(?:^|\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发布于 2017-01-05 00:07:10
这应该根据您的(模糊的)约束来工作:(?i)(?<![#@])x[- ]?men(?!:)( apocalypse)?
(?i) --忽略case标志(?<![#@]) --在“xmen”之前没有#或@[- ]? --可选的-或(?!:) --在“xmen”之后没有冒号( apocalypse)? --可选启示录字符串编辑:不需要在前面/后面有一个空格,我认为有一个边界(\b)将更合适,即(?i)\b(?<!@)(x[- ]?men:?\s?(?:apocalypse)?)\b作为'xmen‘可以开始句子。
https://stackoverflow.com/questions/41474535
复制相似问题