0

私は文字列を持っています:

A12B34C10G34LongerLongerEven LongerA57

正規表現を使用して上記を次の形式に分離する方法はありますか。

A12,B34,C10,G34,Longer,Longer,Even Longer,A57

したがって、カンマで区切ります。どんな助けにも感謝します。ありがとう。

4

6 に答える 6

3

これにより、必要なものが得られます。

<?php
$str = "A12B34C10G34LongerLongerEven LongerA57";

echo preg_replace('/([^\s])([A-Z])/', '\1,\2', $str), "\n";

// OUTPUT: A12,B34,C10,G34,Longer,Longer,Even Longer,A57
于 2013-03-05T09:06:54.483 に答える
2
preg_replace ('/\B([A-Z])/',',$1',$string);

単語境界にない大文字の前にコンマを挿入します。

私の仮定では、入力データは大文字の後に数字と大文字の単語が続き、スペースで区切られている場合と区切られていない場合があります。

于 2013-03-05T09:08:16.787 に答える
2
import re

ss = ' \tA12B34C10#G34LongerVery LongerEven LongerA57 \n'

print '%r\n%r\n\n%r' %\
      (
       #good 1
       re.sub('(?<=\S)(?=[A-Z])', ',', ss),

       #good 2
       ','.join(
           re.findall('(\s*[A-Z].+?\s*)(?=(?<=\S)[A-Z]|\s*\Z)',ss)
           ),


       #bad (written at first)
       ','.join(
           re.findall('(?<!\s)([A-Z].+?)(?<!\s)(?![^A-Z])',ss)
           )
       )

結果

' \tA12,B34,C10#,G34,Longer,Very Longer,Even Longer,A57 \n'
' \tA12,B34,C10#,G34,Longer,Very Longer,Even Longer,A57 \n'

'B34,C10#,G34,Longer,Very Longer,Even Longer'

.

最初の解決策は、アイデア (コンマを挿入する) にできるだけ近いものです。各コンマを文字間
(?<=\S)に挿入する必要があるため(DJV からの修正) 、文字列の先頭と一致し、最初の位置にコンマが追加されるため、このソリューションでは必須です。
(?<!\s)

.

最初の執筆で、私は2番目の解決策を次のように書いていました

# bad
','.join(re.findall( '(?<!\s)([A-Z].+?)(?<!\s)(?![^A-Z])', ss) ) 

また

# bad    
``','.join(re.findall( '(?<!\s)([A-Z].+?)(?<!\s)(?=[A-Z]|\Z)', ss) )`` 

どこで、
(?![^A-Z])または(?=[A-Z]|\Z)一致する部分の可能な終了として、文字列の終了を考慮する必要がありました。
その後
、空白が文字列の先頭または末尾にある場合、問題があることに気付きました。上記のコードは、どれを示しています。
これらの問題を回避するための解決策は、良い解決策の 2 です。しかし、これは複雑で難しいので、良い解決策の 1 が私の好みの解決策であることは明らかです。

于 2013-03-05T12:44:36.657 に答える
1

','スペースが前に付いていない各大文字の前にを追加したい場合は、ここに簡単なPython regex+subの方法があります。

string = 'A12B34C10G34LongerLongerEven LongerA57'
re.sub(r'(?<=[^ ])([A-Z])', lambda x: ',' + x.group(0), string)

出力:

'A12,B34,C10,G34,Longer,Longer,Even Longer,A57'    

regexスペース以外をチェックするために後読みを行い、一致は上位文字です。次に、この上位文字の前に。が付き','ます。

于 2013-03-05T09:46:03.430 に答える
1

これを試して :

$in = 'A12B34C10G34LongerLongerEven LongerA57';
$output = trim(preg_replace('/([^\s])([A-Z])/', "$1,$2", $in),",");
echo $output;

出力:A12,B34,C10,G34,Longer,Longer,Even Longer,A57

于 2013-03-05T09:09:08.123 に答える
0

どこにもコンマが入らないと仮定して、これを使用できます$in

explode(",", preg_replace('/([^\s])([A-Z]+)/', "$1,$2", $in);

Python はよくわかりませんが、基本正規表現は同じです。

于 2013-03-05T09:05:52.317 に答える