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

Python 使用多个分隔符拆分字符串

Python 使用多个分隔符拆分字符串,python,regex,Python,Regex,我想使用python拆分字符串。我已经成功地为一个变量完成了这项工作,但发现为2个变量完成这项工作很困难 字符串: Paragraph 4-2 says. i am going home$ early- Yes. 我需要输出为 Paragraph 4-2 says i am going home early Yes 句子应从、$和-中拆分(但当它位于两个数字(4-2)之间时,不应拆分) 我该怎么做 text.split('.') 更新 新输出应如下所示: Paragraph 4-2 sa

我想使用python拆分字符串。我已经成功地为一个变量完成了这项工作,但发现为2个变量完成这项工作很困难

字符串:

Paragraph 4-2 says. i am going home$ early- Yes.
我需要输出为

Paragraph 4-2 says
i am going home 
early
Yes
句子应从
$
-
中拆分(但当它位于两个数字(4-2)之间时,不应拆分)

我该怎么做

text.split('.')
更新

新输出应如下所示:

Paragraph 4-2 says.
i am going home$ 
early-
Yes.
>>重新导入
>>>第4-2段说。我要早回家$Yes'
>>>
>>>重新拆分(r’(?
>>>导入重新
>>>s='第4-2段说,我要早回家$Yes'
>>>
>>>您可以执行以下操作:

>>> import re
>>> st='Paragraph 4-2 says. i am going home$ early- Yes.'
>>> [m.group(1) for m in re.finditer(r'(.*?[.$\-])(?:\s+|$)',st)]
['Paragraph 4-2 says.', 'i am going home$', 'early-', 'Yes.']
如果您根本不打算修改匹配组(使用strip或其他方法),也可以将findall与相同的正则表达式一起使用:

>>> re.findall(r'(.*?[.$\-])(?:\s+|$)',st)
['Paragraph 4-2 says.', 'i am going home$', 'early-', 'Yes.']
对正则表达式进行了解释,但总结如下:

(.*?[.$\-])  is the capture group containing:
 .*?          Any character (except newline) 0 to infinite times [lazy] 
    [.$\-]   Character class matching .$- one time

(?:\s+|$)    Non-capturing Group containing:
   \s+        First alternate: Whitespace [\t \r\n\f] 1 to infinite times [greedy] 
      |        or
       $      Second alternate: end of string
根据您的字符串,如果您不想将
\r\n\f
\s
匹配,您可能需要将正则表达式更改为
(.*.[.$\-])(?:[+\124;$)
,您可以执行以下操作:

>>> import re
>>> st='Paragraph 4-2 says. i am going home$ early- Yes.'
>>> [m.group(1) for m in re.finditer(r'(.*?[.$\-])(?:\s+|$)',st)]
['Paragraph 4-2 says.', 'i am going home$', 'early-', 'Yes.']
如果您根本不打算修改匹配组(使用strip或其他方法),也可以将findall与相同的正则表达式一起使用:

>>> re.findall(r'(.*?[.$\-])(?:\s+|$)',st)
['Paragraph 4-2 says.', 'i am going home$', 'early-', 'Yes.']
对正则表达式进行了解释,但总结如下:

(.*?[.$\-])  is the capture group containing:
 .*?          Any character (except newline) 0 to infinite times [lazy] 
    [.$\-]   Character class matching .$- one time

(?:\s+|$)    Non-capturing Group containing:
   \s+        First alternate: Whitespace [\t \r\n\f] 1 to infinite times [greedy] 
      |        or
       $      Second alternate: end of string


根据字符串的不同,您可能需要将正则表达式更改为
(.*?[.$\-])(?:[]+\124;$)
如果你不想将
\r\n\f
\s

匹配,
4$2
需要拆分吗?那
4.2
呢?@MartijnPieters我不认为这是重复的;这个问题有更多的内容。@arshajii:很公平,收回了。
4$2
需要拆分吗?那
4.2
呢jnpiers我不认为这是重复的;这个问题还有更多。@arshajii:很好,收回。不需要在字符类中转义点。@SteveP.很好;我添加了一些解释。有没有办法在句子末尾附加拆分字符?(
-.$
)@user1315906你能举个例子说明你的意思吗?我已经更新了我的帖子。请看一看。我已经给出了预期的输出。不需要在字符类中转义点。@SteveP。很公平;我添加了一些解释。有没有办法在句子末尾附加拆分字符?(
-.$
)@user1315906你能举个例子说明你的意思吗?我已经更新了我的帖子。请看一看。我已经给出了预期的输出。我也在考虑使用
findall
,如果我用find all替换split,它将不起作用。我认为split是一个不错的选择。你有固定的格式。对于findall,似乎会有一个更复杂的正则表达式@user1315906I我正在考虑在句子的末尾添加
$-
字符。如果是这样,我应该做什么更改(无论如何,我的原始帖子中没有问到这一点)你是什么意思?如果字符串末尾是
$-
,拆分也会起作用,除非结果列表中有一个空字符串。我不认为这会有问题。我已经更新了我的问题。我已经更新了我帖子中的预期输出。请看一看。如果我用h find all,它不起作用。我认为split是一个不错的选择。您有固定的格式。对于findall,似乎会有一个更复杂的正则表达式。@user1315906I我正在考虑在句子末尾添加
$-
字符。如果是这样,我应该做什么更改(无论如何,我的原始帖子中没有问到这一点)你的意思是什么?如果字符串末尾是
$-
,则拆分也会起作用,但结果列表中会有一个空字符串。我认为这不会有问题。我已更新了我的问题。我已更新了帖子中的预期输出。请看一看。