代码之家  ›  专栏  ›  技术社区  ›  Milano

价格的regex不起作用

  •  3
  • Milano  · 技术社区  · 6 年前

    我需要一个regex来匹配任何数字,后面跟一个由数字、空格、点和逗号组成的字符串,后面跟“k”或“eur”。

    问题是我的 regex 有时并没有找到所有这样的字符串。

    ((\d[., \d]+)(Kč|Eur))
    

    例如:

    re.findall("""((\d[., \d]+)(Kč|Eur))""","Letenky od 12 932 Kč",flags=re.IGNORECASE)
    

    返回Nothing而不是 [(12 932 Kč,12 932,Kč)]

    你知道Regex有什么问题吗?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Wiktor Stribiżew    6 年前

    输入字符串包含一个由基组成的多字节字母 c 字母和音调符号,regex包含带Unicode码位的预组合字母 \u010D .

    你可以用

    (\d(?:[., \d]*\d)?)\s*(K(?:c\u030C|\u010D)|Eur)
    

    (\d[., \d]*)\s*(K(?:č|č)|Eur))
    

    查看 regex ( second regex demo )和 Python demo .

    图案细节

    • \d -数字
    • (?:[., \d]*\d)? -可选出现
      • [., \d]* -零个或多个数字、空格, . ,
      • \ D -数字
    • \s* -0个或更多空白
    • (?:K(?:c\u030C|\u010D)|Eur) -或者 K 后面跟着 c\u030C \ U010D型 ,或 Eur 价值观。

    定义货币regex时,请使用 CZK = ['Czk','K(?:č|č)'] CZK = ['Czk', r'K(?:c\u030C|\u010D)'] .

        2
  •  3
  •   Aankhen Jon    6 年前

    正如Wiktor Stribiew评论的那样, Kč 在你的regexp中不同于 Kč 在您的文本中。您可以使用 unicodedata 两种标准化模块:

    >>> import re
    >>> re.findall("""((\d[., \d]+)(Kč|Eur))""", "Letenky od 12 932 Kč", flags=re.IGNORECASE)
    []
    >>> import unicodedata
    >>> re.findall(unicodedata.normalize("NFD", """((\d[., \d]+)(Kč|Eur))"""), unicodedata.normalize("NFD", "Letenky od 12 932 Kč"), flags=re.IGNORECASE)
    [('12 932 Kč', '12 932 ', 'Kč')]