Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式最好使用的分隔符?_Python_Regex_Parsing - Fatal编程技术网

Python正则表达式最好使用的分隔符?

Python正则表达式最好使用的分隔符?,python,regex,parsing,Python,Regex,Parsing,我试图在python中使用re.split解析一行。下面是我正在尝试的一行示例: drwxr-xr-x 2 user1 user1 4096 Sep 4 14:23 FolderName drwxr-xr-x 2 user1 user1 4096 Sep 4 14:23 FolderName_1 drwxr-xr-x 2 user1 user1 4096 Sep 4 14:23 FolderName 1 我使用下面的

我试图在python中使用re.split解析一行。下面是我正在尝试的一行示例:

drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName
drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName_1
drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName 1
我使用下面的代码将每一行分割成一个数组,只使用最后一个元素

file_folder_names_parsed.insert(file_index, (re.split(r"\s", entry)))
print file_folder_names_parsed[file_index]

#The file/folder name is stored in the last element, lets index to that
num_elements_in_parsed_string = len(file_folder_names_parsed[file_index])
parsed_folder_names.insert(file_index, file_folder_names_parsed[file_index][num_elements_in_parsed_string-1])
现在的问题是,对于前两行,它可以正常工作,并且我能够用以下条目填充列表:[FolderName,FolderName_1]

但是对于最后一个元素,我没有得到[FolderName 1],而是只得到[1]。这是有意义的,因为中间有一个空格字符,我用它作为分隔符。很遗憾,我无法使用\t(tab)作为必须处理的字符串的正则表达式分隔符


对于最后一种情况,有人能建议我如何获取[FolderName 1]而不是当前获取的[1]吗?

只需根据空格进行拆分,空格后面不跟数字和线端锚

>>> m = re.split(r'(?<!:\d{2} \d)\s+(?!\d+$)', 'drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName 1')
>>> m
['drwxr-xr-x', '2', 'user1', 'user1', '4096', 'Sep', '4', '14:23', 'FolderName 1']
>>> m = re.split(r'(?<!:\d{2} \d)\s+(?!\d+$)', 'drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 1 FolderName')
>>> m
['drwxr-xr-x', '2', 'user1', 'user1', '4096', 'Sep', '4', '14:23', '1 FolderName']

m=re.split(r’(?可能是这样的

>>> import re
>>> s = '''drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName
drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName_1
drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName 1'''
>>> re.findall(r'(?<=:\d{2})\s+(.*)(?=\n|$)', s)
['FolderName', 'FolderName_1', 'FolderName 1']
>>重新导入
>>>s=''drwxr-xr-x 2 user1 user1 4096 Sep 4 14:23 FolderName
drwxr-xr-x 2用户1用户1 4096年9月4日14:23文件夹名称
drwxr-xr-x 2用户1用户1 4096年9月4日14:23文件夹名称1''

>>>re.findall(r’(?您应该匹配一个非空的空格字符序列,如:
\s+
。此外,您应该使用
re.split()
maxslit
参数指定您愿意接受的最大拆分次数:

import re
lines = [
'drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName',
'drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName_1',
'drwxr-xr-x   2 user1    user1        4096 Sep  4 14:23 FolderName 1',
]

for entry in lines:
  filename = re.split(r'\s+', entry, maxsplit=8)[-1]
  print filename
拆分前8项后,
re.split()
将行的其余部分作为单个项返回

但是,如果您只是想使用whitepsace作为您的删除工具,则根本不需要
re.split()
。只需使用更简单的
str.split()

上述任一示例都会产生此输出:

FolderName
FolderName_1
文件夹名称1

不要使用
split()
,使用实际模式

重新导入
清单=“drwxr-xr-x 2 user1 user1 4096 Sep 4 14:23 FolderName
drwxr-xr-x 2用户1用户1 4096年9月4日14:23文件夹名称
drwxr-xr-x 2用户1用户1 4096年9月4日14:23文件夹名称1
asdasd
"""
清单\u pattern=r“\s+”。加入([
r“^(?P\S)(?P\S+)”,
r“(?P\d+)”,
r“(?P\S+)”,
r“(?P\S+)”,
r“(?P\S+)”,
r“(?P.*\d:\d\d)”,
r“(?P.*)”,
])
对于iter中的条目(清单.splitlines()):
match=re.match(列表模式,条目)
如果匹配:
打印match.group(“文件名”)
印刷品

FolderName FolderName_1 FolderName 1
同样,假设时间以一个
结尾:“
后跟两个数字是这种方法的弱点。

您可以编写一个模式来分别匹配字符串的每个部分,而不是尝试
拆分
并建立索引。首先。旁白:在上面的代码中,解析了表达式
file\u folder\u names\u[file\u index][num_elements_in_parsed_string-1]
相当于
文件文件夹名称\u parsed[file_index][1]
。更一般地说,当你想要列表的最后一个元素时,使用
xxx[-1]
,而不是
xxx[len(xxx)-1]
。谢谢阿维纳什,这很有帮助。但如果我遇到这样的情况,我必须处理[1 FolderName],它将只解析[FolderName],并省略[1],它实际上是整个文件夹名称的一部分。有没有办法,我可以允许正则表达式也手动创建带有空格但以数字开头的FolderName?或者使用
regex.split(r'(?阿维纳什,你能告诉我这是什么意思吗:做什么?我不是一个真正的正则表达式专家,并且一直在阅读:,但是我不太明白这个字符被解释了…@c0d3rz我会解释我的正则表达式请等一段时间。
FolderName
FolderName_1
FolderName 1