Python在引号上拆分字符串

时间:2013-05-17 07:04:10

标签: python python-2.7

我是一名蟒蛇学习者。如果我在文件中有一行文字看起来像这样

  

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

我可以将引号分开吗?唯一的常量是它们在文件中相对于数据行本身的位置。数据行的范围可以是10到100多个字符(它们是嵌套的网络文件夹)。我无法看到我如何使用任何其他方式来分割这些标记,但是我缺乏python知识使得这很困难。 我试过了

optfile=line.split("")

和其他变化,但继续获得valueerror:空的分隔符。我明白为什么会说,我只是不知道如何改变它。任何帮助,一如既往地非常感激。

非常感谢

9 个答案:

答案 0 :(得分:8)

您必须逃避"

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']

答案 1 :(得分:5)

我只想补充一点,如果你处理看起来像命令行参数的行,那么你可以利用shlex module

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']

答案 2 :(得分:5)

没有正则表达式,没有拆分,只需使用csv.reader

import csv

sample_line = '10.0.0.1 foo "24/Sep/2015:01:08:16 +0800" www.google.com "GET /" -'

def main():
    for l in csv.reader([sample_line], delimiter=' ', quotechar='"'):
        print l

输出

['10.0.0.1', 'foo', '24/Sep/2015:01:08:16 +0800', 'www.google.com', 'GET /', '-']

答案 3 :(得分: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)]

答案 4 :(得分:1)

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

答案 5 :(得分: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"']

答案 6 :(得分: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]

答案 7 :(得分:0)

我知道这在一百万年前得到了解答,但这也有效:

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']

答案 8 :(得分:-1)

我的问题Python - Error Caused by Space in argv Arument被标记为此问题的副本。我们有许多Python书籍回到Python 2.3。最老的引用是使用argv的列表,但没有示例,所以我把事情改为: -

repoCmd = ['Purchaser.py', 'task', repoTask, LastDataPath]
SWCore.main(repoCmd)

并在SWCore中: -

sys.argv = args

shlex模块有效,但我更喜欢这个。