変換リストによる連続置換 - 内部抽出回避No.00156
山紫水明 さん 10/09/25 15:22
 

KRT さん,

>置換リスト側で、[^<]\f(xxxx)\f[^>]
>と、<>に隣接する文字列はヒットしない、様にしているのですが、効き目があ
>りません。

 ご質問の件,実はよく理解できていないのかもわかりませんが,とりあえず,
リストに
[^<]\fxxxx\f[^>], \0○○\2,r
と書いて実行した結果は次のとおりでした。

[実行前]
<<xxxx>xxxx>
<xxxx<xxxx>>
<xx<xxxx>xx>
あxxxxあ

[実行後]
<<xxxx>xxxx>
<xxxx<xxxx>>
<xx<xxxx>xx>
あ○○あ

 もう少し具体的なサンプルテキストとリストがあると,理解しやすいかもしれま
せん。

       では, (^^)/~
              山紫水明

[ ]
RE:00156 変換リストによる連続置換 - 内No.00157
KRT さん 10/09/25 18:46
 
山紫水明さん
早速のお返事、大変有難うございます。
便利なマクロのご提供、有難うございます。

説明不足でした。
具体例として、URLの抽出
置換式:
\fwww\.x{2,}\.co(\.jp)\f♂\0<\1>\2♂r♂nc
\f(x{2,}\.co\.jp)\f♂\0<\1>\2♂r♂nc
\f(x{2,}\.co)\f♂\0<\1>\2♂r♂nc
対象データ:www.xxxxx.co.jp

結果
1巡目 <www.xxxxx.co.jp> この最長文字列ヒットの結果だけが欲しい
2巡目 <www.<xxxxx.co.jp>>
3巡目 <www.<<xxxxx.co>.jp>> これが結果ですが、置換式の最後で、<www.x
xxxx.co.jp>に変換しています。

やりたい事:
<>に隣接する内部の2重抽出はしない様にしたい。
置換式の文頭末に[^<] [^>]を付加しても、効果がない、
現在やっている、最後に解除用の式を加える、という手間を省きたい、
処理時間も短くしたい、
という意味の投稿でした。

時々あるケースなのですが、今上記の簡単な例でやった場合、隣接の内部抽出を再現
出来ません。

(^|[^<])\f(www\.)x{2,}\.co(\.jp)\f([^>]|$)♂\0<\1>\2♂r♂nc
(^|[^<])\f(x{2,}\.co\.jp)\f([^>]|$)♂\0<\1>\2♂r♂nc
(^|[^<])\f(x{2,}\.co)\f([^>]|$)♂\0<\1>\2♂r♂nc

結果:
1巡目 <www.xxxxx.co.jp>
2巡目 <www.<xxxxx.co>.jp>:これは隣接してないので、避けられないかと思い
ます。

すみません。。
次回、改めて具体例を提示しようかと思いますが、
この問題は、置換式の正規表現で回避、するしかないでしょうか?

お手数お掛け致しました。
また、今後マクロの投稿は、こちらにさせて頂きます。

[ ]
RE:00157 変換リストによる連続置換 - 内No.00158
山紫水明 さん 10/09/25 22:14
 
 KRTさん,

 申し訳ありません。いろいろ説明いただいているのですが,やはり理解できま
せん。

>具体例として、URLの抽出
 テキストの中からURLを抽出したいということでしょうか?

>次回、改めて具体例を提示しようかと思いますが、
>この問題は、置換式の正規表現で回避、するしかないでしょうか?

 やはりサンプルテキストとその最終処理結果をご呈示いただいた方が理解しや
すいと思います。

## 識者の皆さん, KRT さんのおやりになりたいことを解説していただける
方おられましたら,お願いします。

     では, (^^)/~
                                    山紫水明
                                    SANSHISUIMEI

[ ]
RE:00157 変換リストによる連続置換 - 内No.00159
山紫水明 さん 10/09/26 18:28
 
 KRTさん,追伸です。

>置換式:
>\fwww\.x{2,}\.co(\.jp)\f♂\0<\1>\2♂r♂nc
>\f(x{2,}\.co\.jp)\f♂\0<\1>\2♂r♂nc
>\f(x{2,}\.co)\f♂\0<\1>\2♂r♂nc
>対象データ:www.xxxxx.co.jp

「♂」は区切り記号だったのですね。これが最初わかりませんでした。
それで,実行してみると,

>結果
>1巡目 <www.xxxxx.co.jp> この最長文字列ヒットの結果だけが欲しい
>2巡目 <www.<xxxxx.co.jp>>
>3巡目 <www.<<xxxxx.co>.jp>> これが結果ですが、置換式の最後で、
><www.xxxxx.co.jp>に変換しています。

たしかにこうなりました。しかし,
T巡目で<www.xxxxx.co.jp>として,最後にまた<www.xxxxx.co.jp>に変換さ
れるようですが,なぜこのようなことをやられるのかがわかりません。
対象データ:www.xxxxx.co.jp を結局どのように加工されたいのでしょうか。

>やりたい事:
><>に隣接する内部の2重抽出はしない様にしたい。
>置換式の文頭末に[^<] [^>]を付加しても、効果がない、
>現在やっている、最後に解除用の式を加える、という手間を省きたい、
>処理時間も短くしたい、

ここのところ及びそれ以降が相変わらず理解できません。
「<>に隣接する内部の2重抽出」とは,この例では具体的には何をさしている
のでしょうか?

     では, (^^)/~
                                    山紫水明
                                    SANSHISUIMEI

[ ]
RE:00159 変換リストによる連続置換 - 内No.00160
KRT さん 10/09/27 11:21
 
山紫水明 さん
度々すみません。
質問しておきながら、解りやすい例が見つからず、大変恐縮です。
見つかってから、再考し、値すれば、再度投稿させて頂こうかと思います。
中途半端な質問なので、無視して頂ければと思いますが、
取り敢えず、ご質問にお応えします。

やりたい事は、テキストの中からのURLの抽出です(正規であれば何でも抽出したい)
元データ(.txt)は全くの任意文字列で、
a) 正規のURLを含む行
b) 全く含まない行
c) URLに似ているが違う文字列を含む行
とマチマチで、雑多です。

例えば、元データが、以下とします(文頭末はスペース)。この場合は全て正規のUR
Lのみの行ですが。
A)元データ
1)  http://www.maruo.co.jp/
2)  www.maruo.co.jp/
3)  http://hide.maruo.co.jp/support/index.html
4)  http://www.hide.maruo.co.jp/support/index.html
5)  www.hide.maruo.co.jp/support/index.html
6)  www.hide.maruo.co.jp/
7)  hide.maruo.co.jp/


うまい例が出てこないのですが、任意のURLの正規表現がかなり複雑で、
置換リストが”かぶる”ケースが出てきます。
即ち、置換リストの下位に、上位に含まれるものがある

例えば、以下様な置換リストで、ii)がi)に含まれています。
i) hide.maruo.co.jp
ii) maruo.co.jp
これを、(hide\.)?maruo.co.jp と1行にすると支障があるケースがあります。

抽出したいのは、任意のURLなので、便宜的に、maruo ->[a-z]+ , hide -> [a-z]+
に差替えると、
\f((http://)?(www\.)?[a-z]+\.[a-z]+\.co\.jp[a-z/\.]*)\f♂\0<\1>\2♂r♂nc
\f((http://)?(www\.)?[a-z]+\.co\.jp[a-z/\.]*)\f♂\0<\1>\2♂r♂nc
(尚、♂は、殆ど使われない文字として、区切記号に選んでいます)

結果はこうなります。
B)抽出結果
1)  <<http://www.maruo.co.jp/>>
2)  <<www.maruo.co.jp/>>
3)  <http://hide.<maruo.co.jp/support/index.html>>
4)  <http://www.hide.<maruo.co.jp/support/index.html>>
5)  <www.hide.<maruo.co.jp/support/index.html>>
6)  <www.hide.<maruo.co.jp/>>
7)  <hide.<maruo.co.jp/>>

ここで、"<<"や">>"を含むものを、"隣接する内部抽出"、と書きました。
マクロの知識はありませんが、"当たり前"、の結果なのだと思います。

[<>]に隣接する場合はヒットしない様に、以下に変更しても、効き目がありません。
[^<]\f((http://)?(www\.)?[a-z]+\.[a-z]+\.co\.jp[a-z/\.]*)\f[^>]♂\0<\1>\
2♂r♂nc
[^<]\f((http://)?(www\.)?[a-z]+\.co\.jp[a-z/\.]*)\f[^>]♂\0<\1>\2♂r♂nc
(ここの書き方が悪いのかも知れません)

欲しいのは、最長ヒットのみなので、
置換式の最後に以下を挿入して、"<<"や">>"を削除しています。
>>♂>♂r♂nc
<<♂<♂r♂nc
<\f[^><]+\f<♂<\1♂r♂nc
>\f[^><]+\f>♂\1>♂r♂nc

C)最終結果
1) <http://www.maruo.co.jp/
2) <www.maruo.co.jp/>
3) <http://hide.maruo.co.jp/support/index.html>
4) <http://www.hide.maruo.co.jp/support/index.html>
5) <www.hide.maruo.co.jp/support/index.html>
6) <www.hide.maruo.co.jp/>
7) <hide.maruo.co.jp/>
8) <maruo.co.jp>

投稿の主旨は、"一発で最終結果を出す、都合のいい方法がありませんか"、というも
のでした。
一度抽出したら、その部分を対象外とする、様な事が出来れば、
便利だな、と思った次第です。
但し、このマクロは十分に高速で、且つ使い勝手が非常にいいので、
実は大した問題ではありません。
私の誤解や、正規表現のミスかも知れません。

この投稿に時間を割かれるのは申し訳ないので、面倒であれば無視して頂ければ、と
思います。
大変失礼しました。



[ ]
RE:00160 変換リストによる連続置換 - 内No.00161
山紫水明 さん 10/09/27 18:21
 
 KRTさん,

>やりたい事は、テキストの中からのURLの抽出です(正規であれば何でも抽出し
>たい)

 もしそうであるのなら,何を正規のURL とするか定義する必要があると思いま
す。

>1)  http://www.maruo.co.jp/
>2)  www.maruo.co.jp/
>3)  http://hide.maruo.co.jp/support/index.html
>4)  http://www.hide.maruo.co.jp/support/index.html
>5)  www.hide.maruo.co.jp/support/index.html
>6)  www.hide.maruo.co.jp/
>7)  hide.maruo.co.jp/

 私の理解ではURLは「http(s)://」で始まる半角の英数字と記号の文字列だと
おもっていますが,ここであげられているのは,必ずしもそれだけではありませ
んね。
 そうなると,たとえば,「.jp」を含む文字列とか「www」を含む文字列だとか,
何か定義する必要があると思います。(実際にはこれらを含まないURLはいくつもあ
るでしょう。)
 その上でどのような方法がふさわしいか,検討する必要があるでしょう。この
マクロの使用が最適かどうかはその後になるような気がします。

     では, (^^)/~
                                    山紫水明
                                    SANSHISUIMEI

[ ]
RE:00161 変換リストによる連続置換 - 内No.00162
KRT さん 10/09/27 20:53
 
山紫水明 さん
ご指摘の通りかと私も思います。
URLのルールは難しく、まだ不十分ですが、
1) (https?|ftp)
2) www\.
3) com, jp等のドメイン末尾(これを全て網羅するのは厄介ですが)
4) 使えない記号を含まない
という様な感じでやってます。
今回投稿させて頂いた、"隣接する内部抽出"については、
URL以外の抽出でもたまに出てきます。

色々とお手数お掛けしました。
今後とも宜しくお願いします。

[ ]
RE:00162 変換リストによる連続置換 - 内No.00163
KRT さん 10/09/27 21:21
 
すみません、修正です。
>4) 使えない記号を含まない
は間違いで、使える文字のみ、でした。
何が使えるのかは、厳密には、把握出来てませんが、
過去の実績からやっています。

[ ]