1

Pythonの正規表現構文をサポートするアプリケーションを使用して、ファイルの名前を変更する作業を手伝っています。以下のa)のようなフォーラムで見つかったいくつかの表現を試しました^[^_]+(?=_)が、正しく機能しなかったほか、機能しなかった表現もありました。それで、私は彼らが何をしているのかを実際に知っている誰かに手を差し伸べるべきだと思いました。ご協力いただきありがとうございます。

a)最初の式では、次のようなパターンで最初の下線の前にあるすべての文字を検索する必要があります。

cannon_mac_23567_prsln_333
jones_james_343342_prsln_333
smith_john_223462_prsln_333

だから、私は大砲、ジョーンズ、そしてスミスを手に入れなければなりません

b)別の式で、最初と2番目の下線の間のすべての文字を検索する必要があります。したがって、上記の例でmac、james、およびjohnを見つける必要があります。

c)最後の式で、最初のアンダースコアを見つける必要があります

名前変更アプリの動作方法上記のように、これらの正規表現を3つの部分で実行する必要があります。ありがとう。

4

3 に答える 3

3

区切り文字がアンダースコアであることを知っているので、正規表現なしでそれを行うことができます。

str.split、、およびindexメソッドを使用します。

'smith_john_223462_prsln_333'.split('_')[0] //(to extract smith)
'smith_john_223462_prsln_333'.split('_')[1] //(to extract john)
'smith_john_223462_prsln_333'.index('_') //(to get position of first underscore)
于 2013-03-06T20:41:19.237 に答える
1

そうです、最初はあなたの質問を誤解しました。str.splitこれを解決するには間違いなくよりエレガントな方法ですが、ニーズに合わせて3つの正規表現を次に示します。あなたのこのアプリケーションが彼らと一緒に働くかどうか私にはわかりません。だからこれを一粒の塩と一緒に取ってください。

詳細については、reライブラリとMatchObject.span()を参照してください。

単一の正規表現として:

import re
line = "cannon_mac_23567_prsln_333"
In [1812]: match = re.match(r"(.+?)(\_)(.+?)\_", line)

In [1813]: match.groups()
Out[1813]: ('cannon', '_', 'mac')

In [1814]: match.span(2)[0] <-- second group, start. The first occurence of _
Out[1814]: 6

In [1815]: line[6]
Out[1815]: '_'

a、b、cで区切られています:

a:

import re
line = "cannon_mac_23567_prsln_333"
In [1707]: match = re.match(r"(.+?)\_", line)

In [1708]: match.groups()
Out[1708]: ('cannon',)

b:

In [1712]: match = re.match(r".+\_(.+?)\_", line)

In [1713]: match.groups()
Out[1713]: ('prsln',)

c:最後の1つは、簡単にするためにre.searchを使用しています。MatchObject.span()位置のタプルを返します(start, end)

In [1763]: match = re.search("\_", line)

In [1764]: match.span()[0]
Out[1764]: 6

In [1765]: line[6]
Out[1765]: '_'
于 2013-03-06T20:46:40.047 に答える
1

私は使用します:

1.  ^([^_]+)_
2.  _([^_]+)_ 
3.  ^[^_]_

文字列の先頭で一致するため、re.matchを使用します。

[編集:クトゥルフが指摘したように、文字列メソッドを使用する方が高速で簡単なので、正規表現を使用しない方がよい場合があります]

于 2013-03-06T20:42:32.043 に答える