0

アルファベット [a-zA-Z] と数字 [0-9] を含む単語を含む文字列入力があるという要件があります。アルファベット部分と数字部分の間にスペースが挿入されるように、そのような単語のそれぞれを区切ることができるようにしたい. たとえば、文字列の場合

"5n7x Jahalducro) P4J99UMH9 (MD) auntud C D T)", 

"P4J99UMH9" という単語は "P 4 J 99 UMH 9" に変換されます Python で re.sub() を使用して順番にこれを行う正規表現がいくつかあります

import re
text = "5n7x Jahalducro) P4J99UMH9 (MD) auntud C D T)"
# For <alpha><number><alpha>    
text = re.sub(r'(?<=[a-zA-Z])([\d]+)(?=[a-zA-Z])', r' \1 '),text)
# For <alpha><number><space>
text = re.sub(r'(?<=[a-zA-Z])([\d]+)(?=\s)', r' \1')

これらの正規表現が機能しない文字列内の特定の単語をマークする機能も必要です。〜のような特殊文字で囲んでこれを行いたいと思います

"5n7x Jahalducro) ~P4J99UMH9~ (MD) auntud C D T)"

これの正規表現をどのように書くのですか?

4

2 に答える 2

0

正の先読みを正規表現に追加できます。

(?<=[a-zA-Z])([\d]+)(?=[a-zA-Z])(?=(?:[^~]*~[^~]*~[^~]*)*$)

正規表現101のデモ

パーツは、一致するパーツの前に(?=(?:[^~]*~[^~]*~[^~]*)*$)偶数個~(またはゼロ) があることを確認します。

于 2013-09-13T07:07:57.060 に答える
0

次のような方法で問題を解決できます。

import re
s = "5n7x Jahalducro) P4J99UMH9 (MD) auntud C D T)"
word_to_enclose = '5n7x'
enclosed_s = re.sub(r'(%s)' % word_to_enclose, r'~\1~', s)
re.sub(r'((?:[A-Za-z](?=\d+(?![A-Za-z\d]*~)))' \
    + r'|(?:\d+(?=[A-Za-z](?![A-Za-z\d]*~))))', r'\1 ', enclosed_s)

結果は次のようになります。

'~5n7x~ Jahalducro) P 4 J 99 UMH 9 (MD) auntud C D T)'

正規表現パターンの説明:

と状況のいずれかをチェックしてい((?:...)|(?:...))ます。最初のものは、 ~ で終わっていない単語の数字で終わる文字[A-Za-z](?=\d+(?![A-Za-z\d]*~)です。\d+(?=[A-Za-z](?![A-Za-z\d]*~)2 つ目は、 ~ で終わらない単語の文字で終わる数字です。この一致のために、末尾のスペースを追加する必要があります。

于 2013-09-13T08:09:26.700 に答える