使用正则表达式

时间:2015-06-06 23:30:49

标签: python regex python-2.7 replace data-cleaning

我有一堆随机文本的行,并在每行的末尾添加一个时间戳。我试图在时间戳之前拆分这些行。

当前输出:

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。我在这里寻找答案,但我已经做不到了。我希望有人可以帮忙!

4 个答案:

答案 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)

从末尾开始分割为16个字符

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)))