8.72. regexpos マッチ位置

  • 書式1: regexpos(str,正規表現)

  • 書式2: regexposw(str,正規表現)

指定した正規表現が最長マッチする文字列 \(str\) の部分文字列の開始位置を返す。 文字列の先頭位置は0であることに注意する。またマッチしなければNULL値を返す。 \(str\) もしくは正規表現にマルチバイト文字を含む場合はregexposw関数を使うこと。

利用例

importと入力データ(CSV)の準備

 1import nysol.mcmd as nm
 2
 3with open('dat1.csv','w') as f:
 4  f.write(
 5'''id,str
 61,xcbbbayy
 72,xxcbaay
 83,
 94,bacabbca
10''')
11
12with open('dat2.csv','w') as f:
13  f.write(
14'''id,str
151,漢漢あbbbいyy
162,漢あbいいy
173,
184,bあいあbbいあ
19''')

基本例

正規表現 c.*a に最も長くマッチする部分文字列の位置を得る。 先頭文字の位置は0であることに注意する。 マッチした部分文字列については regexstr と同じ入力データを使っているので、比較すると分かりやすい。

1nm.mcal(c='regexpos($s{str},"c.*a")', a='rsl', i="dat1.csv", o="rsl1.csv").run()
2### rsl1.csv の内容
3# id,str,rsl
4# 1,xcbbbayy,1
5# 2,xxcbaay,2
6# 3,,
7# 4,bacabbca,2

マルチバイト文字

正規表現 "い.*あ" に最も長くマッチする部分文字列の長さを得る。 ただし、以下ではマルチバイト文字対応でないregexpos関数を使っているので、 文字数ではなくバイト数でカウントした場合の位置を返している。

1nm.mcal(c='regexpos($s{str},"あ.*い")', a='rsl', i="dat2.csv", o="rsl2.csv").run()
2### rsl2.csv の内容
3# id,str,rsl
4# 1,漢漢あbbbいyy,6
5# 2,漢あbいいy,3
6# 3,,
7# 4,bあいあbbいあ,1

マルチバイト文字2

正規表現 "い.*あ" に最も長くマッチする部分文字列の長さを得る。 regexposw関数を使うと、正しくマルチバイト文字を扱ってくれる。

1nm.mcal(c='regexposw($s{str},"あ.*い")', a='rsl', i="dat2.csv", o="rsl3.csv").run()
2### rsl3.csv の内容
3# id,str,rsl
4# 1,漢漢あbbbいyy,2
5# 2,漢あbいいy,1
6# 3,,
7# 4,bあいあbbいあ,1