Python正则表达式最好使用的分隔符?
我试图在python中使用re.split解析一行。下面是我正在尝试的一行示例: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 我使用下面的
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