dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

python での正規表現によるひらがな、カタカナ、漢字の判定

2022-04-01 14:25:15 | python
python での正規表現によるひらがな、カタカナ、漢字の判定方法のメモ。

ひらがな、カタカナはコードポイントの範囲指定でチェックすることができます。
 ひらがな:u+3040 - u+309F
 カタカナ:u+30A0 - u+30FF

また、regex では Script=Hiragana/Katakana/Han を指定することで
ひらがな、カタカナ、漢字の判定を行うことができます。
import sys
import re
import regex

# ひらがな u+3040 - u+309F
str = 'あいうえお'
res = re.match('^[\u3040-\u309F]+$', str)
print(res)
-->
<re.Match object; span=(0, 5), match='あいうえお'>

res = regex.match('^\p{Script=Hiragana}+$', str)
print(res)
-->
<regex.Match object; span=(0, 5), match='あいうえお'>

# カタカナ u+30A0 - u+30FF
str = 'アイウエオ'
res = re.match('^[\u30A0-\u30FF]+$', str)
print(res)
-->
<re.Match object; span=(0, 5), match='アイウエオ'>

res = regex.match('^\p{Script=Katakana}+$', str)
print(res)
-->
<regex.Match object; span=(0, 5), match='アイウエオ'>

# 漢字
str = '漢字'
res = regex.match('^\p{Script=Han}+$', str)
print(res)
-->
<regex.Match object; span=(0, 2), match='漢字'>

# ひらがな+カタカナ
str = 'ひらがなカタカナ'
res = re.match('^[\u3040-\u309F\u30A0-\u30FF]+$', str)
print(res)
-->
<re.Match object; span=(0, 8), match='ひらがなカタカナ'>

# ひらがな+カタカナ+漢字
str = 'ひらがなカタカナ漢字'
res = regex.match('^(?:\p{Script=Hiragana}|\p{Script=Katakana}|\p{Script=Han})+$', str)
print(res)
-->
<regex.Match object; span=(0, 10), match='ひらがなカタカナ漢字'>


lxml で xpath での子孫の検索

2022-04-01 13:48:43 | python
lxml で、あるノードの子孫のノードのみを検索する方法のメモ。

あるノードで node.xpath("//タグ") で検索すると、node が root ノードでなくても
全ノードが検索対象となってしまいます。
子孫のみを検索対象とするには、node.xpath(".//タグ") で検索します。

以下、実行例です。
import sys
import lxml.html

htmlstr = """
<html>
<body>
  <div id="d1">
    <div id="d2-1">
      <div id="d3-1">
        <p id="p4-1">p4-1 text</p>
        <p id="p4-2">p4-2 text</p>
      </div>
      <div id="d3-2"></div>
    </div>
    <div id="d2-2">
      <p id="p3-3">p3-3 text</p>
      <p id="p3-4">p3-4 text</p>
    </div>
  </div>
</body>
</html>
"""

dom = lxml.html.fromstring(htmlstr)

■id 指定でノードを検索
node = dom.xpath("//div[@id='d3-1']")[0]
print(node.tag)
print(node.attrib)
-->
div
{'id': 'd3-1'}

■//p で検索すると、子孫以外のノードも含まれます
ps = node.xpath("//p")
print(len(ps))
for p in ps:
    print(p.attrib)
-->
4
{'id': 'p4-1'}
{'id': 'p4-2'}
{'id': 'p3-3'}
{'id': 'p3-4'}

■.//p で検索すると、子孫のノードのみになります
ps = node.xpath(".//p")
print(len(ps))
for p in ps:
    print(p.attrib)
    print(p.text)
-->
2
{'id': 'p4-1'}
p4-1 text
{'id': 'p4-2'}
p4-2 text