正则表达式:负字符类的例外

时间:2016-10-06 20:12:54

标签: python regex

将Python与Matthew Barnett的正则表达式模块结合使用。

我有这个字符串:

The well known *H*rry P*tter*.

我使用此正则表达式来处理星号以获取<em>H*rry P*tter</em>

REG = re.compile(r"""
(?<!\p{L}|\p{N}|\\)
\*
([^\*]*?) # I need this part to deal with nested patterns; I really can't omit it
\*
(?!\p{L}|\p{N})
""", re.VERBOSE)

问题

问题是这个正则表达式不匹配这种字符串,除非我首先保护字典星号(我将它们转换为十进制实体),这在带有大量星号的文档中非常昂贵。

问题

是否有可能告诉负面类别阻止内部星号只有它们没有被单词字符包围?

我徒劳地尝试了这些模式:

  • ([^(?:[^\p{L}|\p{N}]\*[^\p{L}|\p{N}])]*?)
  • ([^(?<!\p{L}\p{N})\*(?!\p{L}\p{N})]*?)

1 个答案:

答案 0 :(得分:0)

我建议单个正则表达式替换上面提到的案例:

buff1[x] = data[x]

请参阅regex demo

<强>详情:

  • re.sub(r'\B\*\b([^*]*(?:\b\*\b[^*]*)*)\b\*\B', r'<em>\1</em>', s) - \B\*\b前面有一个非单词边界,后跟一个单词边界
  • * - 第1组捕获:
    • ([^*]*(?:\b\*\b[^*]*)*) - 除[^*]*
    • 以外的0个字符
    • * - 零个或多个序列:
      • (?:\b\*\b[^*]*)* - 带有字边界的\b\*\b
      • * - 除[^*]*
      • 以外的0个字符
  • * - \b\*\B后跟非字边界,后面带有字边界

有关字边界和非字边界的更多信息: