正则表达式找到&替换电影名称python

时间:2017-01-04 22:48:32

标签: python regex twitter replace

我一直在处理关于不同电影的推文(使用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'。

那么,有更好的方法吗?也许可以编译不同的正则表达式(增加长度顺序(?))并单独应用它?

修改

约束(或摘要):

  1. 我想找到“x-men”,“x men”,“xmen”
  2. 全部1 +“apocalypse”
  3. 全部1 +“:apocalypse”
  4. 另外:“#xmen”,“#x-men”,“#xmenapocalypse”,“#x-menapocalypse”
  5. 所有不是子串(“@xmenmovie”或“lovexmen perfect”),必须在表达式的开头和结尾包含至少1个空格。
  6. PS:其他电影更容易,但xmen和Rogue One之类的其他电影有很多表达方式,我们希望能够充分利用它。

    PS1:我知道 \ b 可以提供帮助,但我无法理解它是如何运作的。

2 个答案:

答案 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) - 忽略案例标记
  • 'li> (?<![#@]) - 在'xmen'之前没有#@
  • [- ]? - 可选-
  • (?!:) - 'xmen'之后没有冒号
  • ( apocalypse)? - 可选的启示录字符串

编辑:我认为有一个边界(\b)更合适,而不是在前面/后面需要空格,即(?i)\b(?<!@)(x[- ]?men:?\s?(?:apocalypse)?)\b为'xmen'可能开始这句话。