9

私はpython学習者です。ファイルに次のようなテキスト行がある場合

"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"

逆コンマの周りで行を分割できますか? 唯一の定数は、データ行自体に対するファイル内の位置です。データ行は 10 ~ 100 文字以上の範囲である可能性があります (それらはネストされたネットワーク フォルダーになります)。これらのマーカーを分割するために他の方法を使用する方法がわかりませんが、Python の知識が不足しているため、これが困難になっています。私はもう試した

optfile=line.split("")

およびその他のバリエーションですが、valueerror:空のセパレーターを取得し続けます。なぜそう言っているのかはわかりますが、それを変更する方法がわかりません。いつものように、どんな助けでも大歓迎です。

どうもありがとう

4

10 に答える 10

12

次をエスケープする必要があります"

input.split("\"")

結果は

['\n',
 'Y:\\DATA\x0001\\SERVER\\DATA.TXT',
 ' ',
 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT',
 '\n']

結果の空行を削除するには:

[line for line in [line.strip() for line in input.split("\"")] if line]

結果は

['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']
于 2013-05-17T07:09:47.110 に答える
10

コマンドラインパラメーターのように見える行を扱っている場合は、shlex モジュールを利用できる可能性があることを付け加えておきます。

import shlex

with open('somefile') as fin:
    for line in fin:
        print shlex.split(line)

与えます:

['Y:\\DATA\\00001\\SERVER\\DATA.TXT', 'V:\\DATA2\\00002\\SERVER2\\DATA2.TXT']
于 2013-09-09T22:26:31.557 に答える
4

shlexモジュールが役立ちます。

import shlex

my_string = '"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
shlex.split(my_string)

これは吐きます

['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']

参照: https://docs.python.org/2/library/shlex.html

于 2016-06-18T10:18:59.473 に答える
3

すべての正規表現の一致を見つけると、次のようになります。

input=r'"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'

re.findall('".+?"', # or '"[^"]+"', input)

これにより、ファイル名のリストが返されます。

["Y:\DATA\00001\SERVER\DATA.TXT", "V:\DATA2\00002\SERVER2\DATA2.TXT"]

引用符なしでファイル名を取得するには、次を使用します。

[f[1:-1] for f in re.findall('".+?"', input)]

または使用re.finditer

[f.group(1) for f in re.finditer('"(.+?)"', input)]
于 2013-05-17T07:09:33.997 に答える
0

これは100万年前に回答されたことを知っていますが、これも機能します:

input = '"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
input = input.replace('" "','"').split('"')[1:-1]

以下を含むリストとして出力する必要があります。

['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']
于 2016-09-15T10:18:36.880 に答える
0

これが私の解決策でした。コマンドラインに直接渡された場合とまったく同じように、ほとんどの正常な入力を解析します。

import re
def simpleParse(input_):
    def reduce_(quotes):
        return '' if quotes.group(0) == '"' else '"'
    rex = r'("[^"]*"(?:\s|$)|[^\s]+)'

    return [re.sub(r'"{1,2}',reduce_,z.strip()) for z in re.findall(rex,input_)]

ユースケース: コマンド入力をあまりやり直すことなく、多数のシングル ショット スクリプトをユーティリティ ランチャーに収集します。

編集:コマンドラインがくだらない引用を処理する愚かな方法についてOCDを取得し、以下を書きました:

import re
tokens = list()
reading = False
qc = 0
lq = 0
begin = 0
for z in range(len(trial)):
    char = trial[z]
    if re.match(r'[^\s]', char):
        if not reading:
            reading = True
            begin = z
            if re.match(r'"', char):
                begin = z
                qc = 1
            else:
                begin = z - 1
                qc = 0
            lc = begin
        else:
            if re.match(r'"', char):
                qc = qc + 1
                lq = z
    elif reading and qc % 2 == 0:
        reading = False
        if lq == z - 1:
            tokens.append(trial[begin + 1: z - 1])
        else: 
            tokens.append(trial[begin + 1: z])
if reading:
    tokens.append(trial[begin + 1: len(trial) ])
tokens = [re.sub(r'"{1,2}',lambda y:'' if y.group(0) == '"' else '"', z) for z in tokens]
于 2013-09-09T17:59:42.910 に答える
0

あなたが望むのは、スペースで区切られたファイルパスを抽出することだと思います。つまり、見積書に含まれる項目について行を分割します。つまり線で

"FILE PATH" "FILE PATH 2"

あなたがしたい

["FILE PATH","FILE PATH 2"]

その場合:

import re
with open('file.txt') as f:
    for line in f:
        print(re.split(r'(?<=")\s(?=")',line))

file.txt:

"Y:\DATA\00001\SERVER\DATA MINER.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"

出力:

>>> 
['"Y:\\DATA\\00001\\SERVER\\DATA MINER.TXT"', '"V:\\DATA2\\00002\\SERVER2\\DATA2.TXT"']
于 2013-05-17T07:11:31.660 に答える