我一直在处理关于不同电影的推文(使用Twitter搜索API),现在我想用固定的字符串替换匹配。
我一直在努力解决“XMen Apocalypse”,因为有很多方法可以在推特上找到这个。 我寻找“XMen Apocalypse”,“X战警启示录”,“X Men Apocalypse”,“XMen”,“X战警”,“X战警”,它重新回归了我的比赛,其中还包括“@ xmenmovie”, “#xmen”,“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'或'MOVIE_NAMEblabla'。
那么,有更好的方法吗?也许可以编译不同的正则表达式(增加长度顺序(?))并单独应用它?
修改的
约束(或摘要):
PS:其他电影更容易,但xmen和Rogue One之类的其他电影有很多表达方式,我们希望能够充分利用它。
PS1:我知道 \ b 可以提供帮助,但我无法理解它是如何运作的。
答案 0 :(得分:1)
这个应该做的工作:
(?:^|\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
答案 1 :(得分:0)
这应该适用于您的(模糊)约束:
(?i)(?<![#@])x[- ]?men(?!:)( apocalypse)?
(?i)
- 忽略案例标记(?<![#@])
- 在'xmen'之前没有#
或@
[- ]?
- 可选-
或
(?!:)
- 'xmen'之后没有冒号( apocalypse)?
- 可选的启示录字符串 编辑:我认为有一个边界(\b
)更合适,而不是在前面/后面需要空格,即(?i)\b(?<!@)(x[- ]?men:?\s?(?:apocalypse)?)\b
为'xmen'可能开始这句话。