3

次のいずれかを持つことができる正規表現があります。

(src://path/to/foldernames canhave spaces/file.xzy)
(src://path/to/foldernames canhave spaces/file.xzy "optional string")

これらの式は、はるかに長い文字列内で発生します (個々の文字列ではありません)。re.searchorを使用するときに両方の式を一致させるのに問題re.findallがあります (文字列に複数の式がある可能性があるため)。

どちらかを個別に照合するのは簡単ですが、どちらの場合も照合して、2 つのグループが返されるようにするsrc://path/...にはoptional stringどうすれNoneばよいでしょうか。

ORグループを何らかの方法で指定する必要があると考えています---たとえば、次のように考えてください:

パターン\((.*)( ".*")\)は 2 番目のインスタンスに一致しますが、最初のインスタンスには一致しません"..."

r = re.search(r'\((.*)( ".*")\)', '(src://path/to/foldernames canhave spaces/file.xzy)'
r.groups()  # Nothing found
AttributeError: 'NoneType' object has no attribute 'groups'

whileは最初のグループに一致しますが、2 番目のインスタンスで をグループとして\((.*)( ".*")?\)個別に識別しません。"optional string"

r = re.search(r'\((.*)( ".*")?\)', '(src://path/to/foldernames canhave spaces/file.xzy "optional string")')
r.groups()
('src://path/to/foldernames canhave spaces/file.xzy "optional string"', None)

(通常の表現の)表現の達人たち、何か考えはありますか?

4

2 に答える 2

2

は通常、ファイル名に含めることが許可されていないため"、単純に最初のグループから除外できます。

r = re.search(r'\(([^"]*)( ".*")?\)', input)

これは一般的に、より効率的な傾向があるため、貪欲でない繰り返しの代替として推奨されます。なんらかの理由でファイル名に実際に引用符を含めることができる場合は、(agfの回答のように)貪欲でない繰り返しが最善の策です。

于 2013-08-24T16:10:40.413 に答える