我有一堆随机文本的行,并在每行的末尾添加一个时间戳。我试图在时间戳之前拆分这些行。
当前输出:
Yes, I'd say so. Nov 08, 2014 UTC
Hell yes! Oct 01, 2014 UTC
Anbefalt som bare det, løp og kjøp. Sep 16, 2014 UTC
Etc.
所需的输出(" tab"我指的是实际的空格):
Yes, I'd say so. <tab> Nov 08, 2014 UTC
Hell yes! <tab> Oct 01, 2014 UTC
Anbefalt som bare det, løp og kjøp. <tab> Sep 16, 2014 UTC
Etc.
到目前为止,我已经使用过&#34;替换&#34;在月份之前放置制表符。像这样:
my_string.replace("May ", "\tMay ").replace("Apr ", "\tApr ").replace("Mar ", "\tMar ").replace("Feb ", "\tFeb ") etc. (incomplete code)
这非常有效,除非随机文本涉及一个月的名称,例如&#34;我最后一次购买它,很棒的东西&#34;。由于日期是以特定方式格式化的,因此如果可能的话,我希望使用正则表达式和通配符来改进日期。有没有办法在这些日期之前放置标签?如您所见,日期格式如下:
[Three-letter abbreviation of the month] [two-digit day] [,] [four-digit year] [UTC]
E.g。
Oct 31, 2014 UTC
原谅业余代码和方法,我是绝对的正则表达式n00b。我在这里寻找答案,但我已经做不到了。我希望有人可以帮忙!
答案 0 :(得分:2)
如果你总能保证它是那么多单词,那么你不需要正则表达式,只需使用内置函数进行反向拆分和连接,例如:
s = "Yes, I'd say so. Nov 08, 2014 UTC"
split = s.rsplit(None, 4)
new = split[0] + '\t' + ' '.join(split[1:])
# "Yes, I'd say so.\tNov 08, 2014 UTC"
答案 1 :(得分:1)
您应该可以使用一个RegeEx进行所有这几个月:
import re
lines = [
"Yes, I'd say so. Nov 08, 2014 UTC",
"Hell yes! Oct 01, 2014 UTC"
]
for ln in lines:
print re.sub(r'(\w+\s\d{2}, \d{4} UTC)$', r'\t\1', ln)
将返回:
Yes, I'd say so. Nov 08, 2014 UTC
Hell yes! Oct 01, 2014 UTC
它的工作原理很简单。 re.sub
捕获第一个参数括号中的所有内容,并将其分配给\1
。第二个参数r'\t\1'
是我们想要替换字符串的内容。
在您的情况下,您希望将原始字符串(由\1
表示)替换为前面的制表符(\t
)。
答案 2 :(得分:0)
如果您想为每个月的名称使用正则表达式并添加标签,请使用re.sub:
lines = """Yes, I'd say so. Nov 08, 2014 UTC
Hell yes! Oct 01, 2014 UTC
Anbefalt som bare det, løp og kjøp. Sep 16, 2014 UTC"""
r = re.compile(r"\bJan\b|\bFeb\b|\bMar\b|\bApr\b|\bMay\b|\bJun\b|\bJul\b|\bAug\b|\bSep\b|\bOct\b|\bNov\b|\bDec\b")
for line in lines.splitlines():
print(r.sub("\t"+r"\g<0>", line))
输出:
Yes, I'd say so. Nov 08, 2014 UTC
Hell yes! Oct 01, 2014 UTC
Anbefalt som bare det, løp og kjøp. Sep 16, 2014 UTC
这些行的格式无关紧要,正则表达式仍会找到任何月份的完全匹配。
要精确匹配月份空格数字和逗号:
r = re.compile(r"(\bJan\b)\s+\d+,|(\bFeb\b)\s+\d+,|(\bMar\b)\s+\d+,|(\bApr\b)\s+\d+,|"
r"(\bMay\b)\s+\d+,|(\bJun\b)\d+,|(\bJul\b)\s+\d+,|(\bAug\b)\s+\d+,|"
r"(\bSep\b)\s+\d+,|(\bOct\b)\s+\d+,|(\bNov\b)\s+\d+,|(\bDec\b)\s+\d+,")
答案 3 :(得分:-1)
data = """Yes, I'd say so. Nov 08, 2014 UTC
Hell yes! Oct 01, 2014 UTC
Anbefalt som bare det, løp og kjøp. Sep 16, 2014 UTC"""
您也可以根据自己的喜好重新格式化日期。
from datetime import datetime
fmt = "%b %d, %Y %Z"
for line in data.split("\n"):
txt = line[:-16]
dt = datetime.strptime(line[-16:], fmt)
print("{}\t{}".format(txt, dt.strftime(fmt)))