0

我在 Drupal 网站上有一个术语列表:

  • 艺术
  • 美术
  • 运动的
  • ポーツ

我需要通过正则表达式过滤这些术语,并且表达式只需要对日语术语(美术,スポーツ)评估为真。

以下条件为真:

  • 所有英文术语仅由大写和小写字母组成。
  • 所有日文术语将仅包含日文字符(汉字和假名)。

我之前写过一些正则表达式,但我不知道如何处理 Unicode。像这样的表达可以[a-zA-Z]*抓住所有的术语,包括日文的。

4

1 回答 1

1

在此处使用范围:http ://en.wikipedia.org/wiki/Japanese_writing_system

>>> import re
>>> kanji = map(unichr, range(0x4e00, 0x9fbf + 1))
>>> katakana = map(unichr, range(0x30a0, 0x30ff + 1))
>>> hiragana = map(unichr, range(0x3040, 0x309f + 1))
>>> japanese = ''.join(kanji + katakana + hiragana)
>>> pattern = r'^[%s\s]+$' % japanese
>>> re.compile(pattern, re.U).match('スポーツ'.decode('utf8'))
<_sre.SRE_Match object at 0x9e6a090>
>>> re.compile(pattern, re.U).match('スポーツtest'.decode('utf8'))
>>>

这当然是 Python,希望您可以根据自己选择的语言对其进行修改。

可能关键是使用锚 ^ 和 $ 来确保您匹配整个字符串。[a-zA-Z]* 匹配所有术语的原因是因为 '*' 表示“0 或更多”。此外,请确保解码任何输入字符串,因为如果将其编码为 UTF-8,它将不匹配。在这种情况下,'U' 标志实际上并不是必需的,因为您没有要求正则表达式引擎为您决定 \w、\W、\b、\B。

此外,在重新阅读您的问题后,您不希望输入中有空格,因此您可以去掉正则表达式中的 '\s'。

于 2012-05-08T03:12:10.830 回答