【问题标题】:split utf8 strings into parts with regexp使用正则表达式将 utf8 字符串拆分为多个部分
【发布时间】:2011-02-05 08:41:55
【问题描述】:

我需要在以=? 开头并以?= 结尾的文本字符串中查找并翻译它们。我以这样的表达结束:

re.sub('=\?[\w\?\-\/=\+\:\;_\,\[\]\(\)\<\>]+\?=', decode_match, string)

它在 95% 的情况下都有效,但它会因类似的字符串而失败:

=?utf-8asdfaDDS23=eFF?=-=?utf-8?eadf-,=?=

有人可以帮忙吗?

【问题讨论】:

  • 你确定你的输入是这样的吗?
  • 我喜欢 jswolf 的简单回答,但是如果您在原始正则表达式的加号之后添加一个惰性量词(即 '=\?[\w\?\-\/=\+\:\;_\,\[\]\(\)\&lt;\&gt;]+?\?='),它也应该可以工作(如在此处测试:ideone.com/601LA )
  • 那更好 '=\?(?:[\w\?\-\/=\+\:\;_\,[]()\]+?)\ ?='
  • 如果您想要整个匹配字符串(包括分隔符),我认为将其设为非捕获组是没有意义的。如果您只想要标记(分隔符之间的文本),请将其保留为捕获组,如 ideone 测试中所示。

标签: python regex utf-8


【解决方案1】:

你需要你有的情况吗?在您的模式中不匹配 ?=

'=\?(?:[^?]|\?[^=])+\?='

【讨论】:

  • 谢谢!你能解释一下这个正则表达式吗?
  • 好吧,首先匹配 =?,然后匹配一个或多个不是 ?用 [^?] 或 ?以及下一个不是带有 \?[^=] 的 = 的字符。 (?:) 是非捕获分组,因此它与使用括号而不获取输出变量相同。
  • 如果分隔符之前的最后一个字符是?(例如=?utf-8asdf??=),这将不起作用。您的否定字符类 ([^=]) 应该是负前瞻 ((?!=))。
  • @Alan 同意...您还可以允许一个可能的?在结束分隔符之前很有趣'=\?(?:[^?]|\?[^=])+\?*\?='
  • 不,\?[^=] 仍然会在\?*\?= 看到它们之前消耗两个问号。
【解决方案2】:

str.split('=?') 能解决问题吗?

【讨论】:

    【解决方案3】:

    你为什么不写? :

    re.sub('=\?.+?\?=', decode_match, string)
    

    此正则表达式将在 '=?utf-8asdfaDDS23=eFF?=-=?utf-8?eadf-,=?=' 中匹配两次

    '=?utf-8asdfaDDS23=eFF?='
    
    '=?utf-8?eadf-,=?='
    

    这是你想要的吗?当唤起失败时,你应该更精确地给出它。

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2012-12-07
      • 2013-09-11
      • 2019-10-28
      • 1970-01-01
      • 2019-04-11
      相关资源
      最近更新 更多