Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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_Split - Fatal编程技术网

Python重新拆分并将匹配的组附加到拆分的右侧或左侧

Python重新拆分并将匹配的组附加到拆分的右侧或左侧,python,regex,split,Python,Regex,Split,从这个例子中: >>> re.split('(\W)', 'foo/bar spam\neggs') ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs'] 是否有一种直接的方法将捕获组与拆分的右侧或左侧部分关联?例如,使用相同的正则表达式/捕获组,但产生: ['foo', '/bar', ' spam', '\neggs'] 或者选择 ['foo/', 'bar ', 'spam\n', 'eggs'] 我相信您可以通过更改实际的正

从这个例子中:

>>> re.split('(\W)', 'foo/bar spam\neggs')
['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
是否有一种直接的方法将捕获组与拆分的右侧或左侧部分关联?例如,使用相同的正则表达式/捕获组,但产生:

['foo', '/bar', ' spam', '\neggs']
或者选择

['foo/', 'bar ', 'spam\n', 'eggs']
我相信您可以通过更改实际的正则表达式来实现这一点,但这不是重点(我们可以修改示例以使匹配更加复杂,因此无法重复使用它们并将它们推到右侧或左侧是一种真正的痛苦)

不幸的是,使其成为非捕获组似乎只是从匹配中删除了相应的字符:

>>> re.split('(?:\W)', 'foo/bar spam\neggs')
['foo', 'bar', 'spam', 'eggs']

另一个例子,考虑如果你从一个行为不当的CSV文件中得到了一些文本。每一行只有一个实际的逗号可以分割,但意外的是,有些行在其中一个字段中也有一个逗号。幸运的是,非拆分逗号后面总是跟一个空格

csv_data = [
    'Some good data,Id 5',
    'Some bad data, like, really bad, dude,Id 6'
]
本例的目标是将其处理为:

[['Some good data', 'Id 5'],
 ['Some bad data, like, really bad, dude', 'Id 6']]
通过使用简单的
re.split

使用
map(lambda x:re.split(,(?:\S)”,x),csv_数据)
生成

[['Some good data', 'd 5'], 
 ['Some bad data, like, really bad, dude', 'd 6']]
[['Some good data', 'I', 'd 5'],
 ['Some bad data, like, really bad, dude', 'I', 'd 6']]
使用
map(lambda x:re.split(,(\S)”,x),csv\u数据)
生成

[['Some good data', 'd 5'], 
 ['Some bad data, like, really bad, dude', 'd 6']]
[['Some good data', 'I', 'd 5'],
 ['Some bad data, like, really bad, dude', 'I', 'd 6']]
那么,对于这两种情况,对
re.split
的通用方法是什么呢?基本上我可以在函数中包装一些东西,比如

def my_split(regex_chars, my_strs):
    return map(lambda x: re.split(...regex_chars..., x), my_strs)
使两者

my_split(r'(\W)', ['foo/bar spam\neggs']) 

每个都返回如上所述的预期输出


注:仅在
re
中,这似乎是不可能的,但在
regex
re
的混合中,这是可能的,这取决于拆分是否为零宽度。

不,这是不可能的。我不知道有哪个正则表达式引擎支持这种东西。拆分意味着拆分:您可以保留拆分器,也可以丢弃拆分器,但不能将拆分器与拆分器之间的碎片混在一起,因为分隔器与其拆分的对象不同

使用该模块,您可以相当简单地执行此操作,但它确实需要更改原始正则表达式:

>>> regex.split('(?=\W)', 'foo/bar spam\neggs', flags=regex.V1)
['foo', '/bar', ' spam', '\neggs']
与内置的
re
模块不同,
regex
模块允许对零宽度匹配进行拆分,因此您可以在下一个字符匹配的位置使用前瞻性拆分
\W

在您在编辑中添加的示例中,即使使用纯
re
,也可以使用lookahead执行此操作,因为拆分器不是零宽度:

>>> map(lambda x: re.split(",(?=\S)", x), csv_data)
[['Some good data', 'Id 5'],
 ['Some bad data, like, really bad, dude', 'Id 6']]

不,这是不可能的。我不知道有哪个正则表达式引擎支持这种东西。拆分意味着拆分:您可以保留拆分器,也可以丢弃拆分器,但不能将拆分器与拆分器之间的碎片混在一起,因为分隔器与其拆分的对象不同

使用该模块,您可以相当简单地执行此操作,但它确实需要更改原始正则表达式:

>>> regex.split('(?=\W)', 'foo/bar spam\neggs', flags=regex.V1)
['foo', '/bar', ' spam', '\neggs']
与内置的
re
模块不同,
regex
模块允许对零宽度匹配进行拆分,因此您可以在下一个字符匹配的位置使用前瞻性拆分
\W

在您在编辑中添加的示例中,即使使用纯
re
,也可以使用lookahead执行此操作,因为拆分器不是零宽度:

>>> map(lambda x: re.split(",(?=\S)", x), csv_data)
[['Some good data', 'Id 5'],
 ['Some bad data, like, really bad, dude', 'Id 6']]

在这种情况下,您可以使用基于负前瞻的正则表达式,如下所示

>>> csv_data = [
    'Some good data,Id 5',
    'Some bad data, like, really bad, dude,Id 6'
]
>>> [re.split(r',(?!\s)', i) for i in csv_data]
[['Some good data', 'Id 5'], ['Some bad data, like, really bad, dude', 'Id 6']]

,(?!\s)
匹配所有不后跟空格字符的逗号。根据匹配的逗号进行拆分将得到所需的输出。

在这种情况下,您可以使用基于负前瞻的正则表达式,如下所示

>>> csv_data = [
    'Some good data,Id 5',
    'Some bad data, like, really bad, dude,Id 6'
]
>>> [re.split(r',(?!\s)', i) for i in csv_data]
[['Some good data', 'Id 5'], ['Some bad data, like, really bad, dude', 'Id 6']]

,(?!\s)
匹配所有不后跟空格字符的逗号。根据匹配的逗号进行拆分将获得所需的输出。

如果坚持使用
re.split(),则需要修改正则表达式
re.split不能直接实现,因为split不能在边界上工作。@hwnd那么上面的注释就是答案。如果坚持使用
re.split(),则需要修改正则表达式
re.split不能直接实现,因为split不能在边界上工作。@hwnd那么上面的评论就是答案。你能解释一下
regex.V1
flag的作用吗?@AvinashRaj:我链接到的文档页上描述了它。我会对它进行一些不同的描述(请参阅我的扩展示例,问题底部添加了逗号)。它不一定是零宽度拆分。在逗号示例中,您希望拆分为单个字符(逗号),但仅拆分具有特定属性的特定逗号(后跟非空格字符)。不管那个非空格字符是什么,它都不重要,也不是分割的一部分(只是识别逗号的一部分),而且那个非空格字符需要放在某个地方(在我的例子中,放在分割的右边)。也许这是可以实现的?@F先生:如果这是你想要的,你应该在你的问题中这样说。我编辑了我的答案,以展示你是如何做到这一点的。我想我在我的问题中已经说过了,但没有意识到需要额外的例子才能清楚。你能解释一下
regex.V1
flag的作用吗?@AvinashRaj:这是描述在我链接到的文档页面上。我会对其进行一些不同的描述(请参阅问题底部添加逗号的扩展示例)。它不一定是零宽度拆分。在逗号示例中,您希望拆分为单个字符(逗号),但只拆分具有特定属性的特定逗号(后面紧跟着一个非空格字符)。无论该非空格字符是什么,都不重要,也不是拆分的一部分(只是识别逗号的一部分),并且该非空格字符需要放在某个地方(在我的例子中,放在拆分的右边).也许这是可以实现的?@F先生:如果这是你想要的,你应该在你的问题中这样说。我编辑了我的答案,以展示你是如何做到这一点的。我想我在我的问题和d中已经说过了