我想用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.
发布于 2013-07-27 16:38:47
你可以这样做:
>>> 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.']
如果根本不修改匹配组(带条或其他内容),也可以用相同的regex使用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
匹配,则可能需要将正则表达式更改为\s
发布于 2013-07-27 15:54:24
>>> import re
>>> s = 'Paragraph 4-2 says. i am going home$ early- Yes'
>>>
>>> re.split(r'(?<!\d)\s*[.$-]\s*(?!\d)', s)
['Paragraph 4-2 says', 'i am going home', 'early', 'Yes']
\s*[.$-]\s*
匹配由0或多个空格(\s*
)包围的.
、$
或-
中的任何一个。(?<!\d)
是一个负后视,以确保匹配前没有数字。(?!\d)
是一个负前瞻,以确保匹配后没有一个数字.您可以阅读更多关于这里的内容。
发布于 2013-07-27 15:54:49
>>> re.split('(?<=\D)[.$-](?=\D|$)', s)
['Paragraph 4-2 says', ' i am going home', ' early', ' Yes']
>>>
(?<\D)[.$-](?=\D)
将得到.$-,而不是跟随或由中间人进行操作。而查找和查找将不会消耗任何字符串。因此,字符串将只分裂.$-,而不是被它包围的数字。
编辑:
>>> re.findall('.*?(?<=\D)[.$-](?=[\D]|$)', s)
['Paragraph 4-2 says.', ' i am going home$', ' early-', ' Yes.']
https://stackoverflow.com/questions/17899635
复制相似问题