1

正規表現を使用したパターンマッチングの経験はこれが初めてなので、助けていただければ幸いです。

次の部分文字列の文字列を検索しようとしています。

"(TPU 1-999)
http://somewebaddress.com"

TPU1-999およびリンクを個別のサブ文字列として保持したいと思います。

これは私が使用しているパターンです:

^\s{3}\(([AEINPRSTUW]{3})\s(\d{1,3}.\d{2,5})\)$^\s{3}(http+\s{1,100})$

私の推論を説明するためにそれを分解します

^\s{3}-文字列(この場合は行)の先頭、その後に3つのスペース

\(-左括弧

([AEINPRSTUW]{3})-括弧内の任意の文字の3つのインスタンス、TPUは1つの例です

\s(\d{1,3}.\d{2,5})-スペースと1〜3桁の数字、さらに2〜5桁の数字から任意の文字で区切る

\)$-右括弧、行末

^\s{3}-次の行の先頭に3つのスペースが続きます

(http+\s{1,100})$-文字「http」の後に1〜100文字の非空白文字が続き、行の終わり。

このパターンは現在機能していませんが、正しい方向に向かっていますか?

4

3 に答える 3

4

$^これは機能しません。$は行の終わり(改行の前)、は行^の始まり(改行の後)です。ただし、改行は1文字(または2文字)ですが、正規表現エンジンの位置を進めないでください。したがって$^同じ位置に一致させるようにしてください。これは、空の行の終わりと始まりである場合にのみ発生する可能性があります。それでも、これらをこの順序で並べると、非常に誤解を招く可能性があります。それらの間にちょうど1つの改行があることを確認したい場合は、これを試してください。

^\s{3}\(([AEINPRSTUW]{3})\s(\d{1,3}.\d{2,5})\)$(\r\n?|\n)^\s{3}(http+\S{1,100})$

ただし、ridgerunnerがコメントを指摘したように、以下\s{3}は空白であるため、より多くの改行に一致する可能性があります(最大3つ)。

.また、数字の区切り文字としては最善の方法ではない場合があることにも注意してください。少なくとも、数字以外の文字を使用してください。

^\s{3}\(([AEINPRSTUW]{3})\s(\d{1,3}\D\d{2,5})\)$(\r\n?|\n)^\s{3}(http+\S{1,100})$

\s最後をに変更したことにも注意してください\S(空白であるため\s\S非空白であるため)。

また、表示した文字列には、一致させようとしている3つの空白が含まれていないことにも注意してください。したがって、(CaptainMurphyが提案したように)オプションにすることも役立つ場合があります。

^\s*\(([AEINPRSTUW]{3})\s(\d{1,3}\D\d{2,5})\)$(\r\n?|\n)^\s*(http+\S{1,100})$

そして、すでにその改行を一致させているので、そこにあるアンカーを完全に削除することもできますが、実際にはそれ以上役に立ちません。

^\s*\(([AEINPRSTUW]{3})\s(\d{1,3}\D\d{2,5})\)(\r\n?|\n)\s*(http+\S{1,100})$
于 2012-10-25T15:44:56.870 に答える
1

大文字や特定の量の空白などを過度に具体化していると思います(例の文字列には最初に空白さえありません)。非常に具体的なものを探しているのでない限り、私はほとんど*と+に固執します。別の回答が指摘しているように、$はレコード全体(文字列)の終わりであり、行の終わりではありません。改行またはCRLFは単なる空白です。非空白には\sまたは[^\s]を使用しないでください。\Sを使用してください。

ss="(TPU 1-999)\nhttp://something.com"
rr="^\s*\(([A-Z]+)\s+(\d+.\d+)\)\s+(http\S{1,100})$"
re.match(rr,ss).groups()
('TPU', '1-999', 'http://something.com')
于 2012-10-25T15:49:02.760 に答える
1

私は本当にこれを考えすぎていました。これが私が提供された答えに基づいて私が思いついた解決策です:

これが私が解析している文字列の例です(電子メールメッセージの内容から引き出されます):

'The writeboard named "10/26 newsletters (Pat)" has been created:\r\n\r\n (TPU 1000+)\r\n\r\n http://www.techproductupdate.com/resources/2313/splunk-app-for-vmware-delivers-insight-into-the-cloud\r\n\r\n (TIN 250+)\r\n\r\n http://www.techproductupdate.com/resources/2369/securing-mysql-databases\r\n\r\n (TPU 500+)\r\n\r\n http://www.techproductupdate.com/resources/2333/designing-a-data-protection-strategy-with-hp-lefthand-hp-storeonce-and-hp-tape\r\n\r\n- - -\r\nYou can visit the writeboard at:\r\n http://somewebsite.com\r\n'

だから最初に私re.findallはパターンを使用して括弧の間のすべてを見つけるために使用します'\((?P<list>[A-Z]*)\s(?P<segments>.+)\)'

次にre.findall、パターンを使用してすべてのURLを検索するために使用します。これにより、リストの最後に'http\S*'余分なものを含めて、必要なすべての結果が返されます。'http://somewebsite.com'

次に、最後のリストの最後の要素を除いて、これらのリストを一緒に圧縮すると、基本的に、最初に探していた結果が得られます。

于 2012-10-25T18:11:27.470 に答える