我有一个从文本文件中提取的消息字符串列表,所有这些消息看起来都是这样的:
s = 'Nov 1 11 45 AM Jane Doe hi
我需要它看起来像这样:
'Nov 1 11 45 AM, Jane Doe, hi'
我把它作为我的代码,因为首先我正在处理时间和名称的拆分,然后我计划分别处理名称和消息:
rx = re.compile(r'B(AM|PM)s')
r=rx.split(s)
但它打印的是:
'Nov 1 11 45 ', 'AM', 'Jane Doe hi'
关于如何在分隔符后拆分有什么想法吗?
谢谢!
假设您也需要在多次出现之后进行拆分,并且您没有在"Doe"之后或"hi"之前进行拆分:
s = 'Want to split AM with some PM and more'
split_after = ['AM', 'PM']
rx = re.compile(rf'(?<=({"|".join(split_after)}))[^b]')
result = ', '.join(x for x in rx.split(s) if x not in split_after)
结果将是:
'Want to split AM, with some PM, and more'
像这样使用re.sub
:
import re
s = 'Nov 1 11 45 AM Jane Doe hi'
# Partial solution:
foo = re.sub(r'(AM|PM)', '\1,', s)
print(foo)
# Nov 1 11 45 AM, Jane Doe hi
# Complete solution:
bar = re.sub(r'(AM|PM)(s+S+s+S+)', '\1,\2,', s)
print(bar)
# Nov 1 11 45 AM, Jane Doe, hi
r'(AM|PM)'
:匹配AM
或PM
,并将其存储在匹配变量1
中,然后再次转义(\1
(并在替换字符串中使用r'(AM|PM)(s+S+s+S+)'
:匹配AM
或PM
,然后是一个或多个空白字符,再匹配一个或更多个非空白字符,然后再次匹配。将结果存储在匹配变量1
和2
中。请注意,匹配变量是根据左括号的位置从左到右进行编号的。
这里有一个将行分为两部分的示例:日期和其余部分还有一个例子可以得到3个部分:日期、名称(2个单词(,其余部分是消息
import re
s = 'Nov 1 11 45 AM Jane Doe hi to all of you'
rx = re.compile(r'(.*AM|PM)(.*)')
r=rx.findall(s)
print(r)
结果是:
[('Nov 1 11 45 AM', ' Jane Doe hi to all of you')]
这个例子展示了如何获得3个部分:日期、名称(2个单词(,其余部分是消息
rx = re.compile(r'(.*AM|PM)(.+? .+?) (.*)')
r=rx.findall(s)
print(r)
结果是:
[('Nov 1 11 45 AM', ' Jane Doe', 'hi to all of you')]