使用Regex re.sub删除包含指定单词之前的所有内容

时间:2014-07-30 19:31:04

标签: python regex

我有一个字符串,看起来像“Blah blah blah,更新:2012年8月23日”,我想使用Regex提取日期Aug. 23, 2012。我在堆栈中发现了一篇类似的文章:regex to remove all text before a character,但是当我尝试时这个文章都不起作用

date_div = "Blah blah blah, Updated: Aug. 23, 2012"
extracted_date = re.sub('^[^Updated]*',"", date_div)

如何删除所有内容,包括已更新内容,以便只剩下Aug. 23, 2012

谢谢!

3 个答案:

答案 0 :(得分:8)

在这种情况下,您可以在没有正则表达式的情况下执行此操作,例如:

>>> date_div = "Blah blah blah, Updated: Aug. 23, 2012"
>>> date_div.split('Updated: ')
['Blah blah blah, ', 'Aug. 23, 2012']
>>> date_div.split('Updated: ')[-1]
'Aug. 23, 2012'

答案 1 :(得分:5)

您可以使用Lookahead:

import re
date_div = "Blah blah blah, Updated: Aug. 23, 2012"
extracted_date = re.sub('^(.*)(?=Updated)',"", date_div)
print extracted_date

<强>输出

Updated: Aug. 23, 2012

修改
如果下面的MattDMo评论是正确的,您想要删除&#34;更新:&#34;你也可以这样做:

extracted_date = re.sub('^(.*Updated: )',"", date_div)

答案 2 :(得分:2)

使用正则表达式,您可以使用两个正则表达式,具体取决于单词的出现:

# Remove all up to the first occurrence of the word including it (non-greedy):
^.*?word
# Remove all up to the last occurrence of the word including it (greedy):
^.*word

请参见non-greedy regex demogreedy regex demo

^匹配字符串位置的开头,.*?匹配任何0+个字符(注意使用re.DOTALL标志,以便.可以匹配换行符)为< em> fem (尽可能多地匹配.*许多),然后word匹配并消耗(即增加匹配并提高正则表达式索引)这个单词。

请注意re.escape(up_to_word)的使用:如果您的up_to_word不包含唯一的字母数字和下划线字符,则使用re.escape更为安全,这样(这样的特殊字符,[?等无法阻止正则表达式找到有效的匹配项。

请参见Python demo

import re

date_div = "Blah blah\nblah, Updated: Aug. 23, 2012 Blah blah Updated: Feb. 13, 2019"

up_to_word = "Updated:"
rx_to_first = r'^.*?{}'.format(re.escape(up_to_word))
rx_to_last = r'^.*{}'.format(re.escape(up_to_word))

print("Remove all up to the first occurrence of the word including it:")
print(re.sub(rx_to_first, '', date_div, flags=re.DOTALL).strip())
print("Remove all up to the last occurrence of the word including it:")
print(re.sub(rx_to_last, '', date_div, flags=re.DOTALL).strip())

输出:

Remove all up to the first occurrence of the word including it:
Aug. 23, 2012 Blah blah Updated: Feb. 13, 2019
Remove all up to the last occurrence of the word including it:
Feb. 13, 2019