我有一个这样的日期字符串 -
bla bla, janaury 1932 bla bla
我想只使用正则表达式获取 jan 1932 (1月份有拼写错误)
如果我使用jan [a-z]*\s\d{4}
,显然我会 - “janaury 1932”
答案 0 :(得分:5)
捕获您需要的部件,然后加入:
import re
s = 'bla bla, janaury 1932 bla bla'
m = re.search(r"\b([^\W\d_]{3})\w*\s+([0-9]{4})\b", s)
if m:
print("{} {}".format(m.group(1),m.group(2))) # => jan 1932
请参阅Python demo
注意:如果您想确保匹配其中一个月份名称,请使用基于交替的正则表达式:
m = re.search(r"\b(j(?:an|u[nl])|feb|ma[ry]|a(?:pr|ug)|sep|oct|nov|dec)\w*\s+([0-9]{4})\b", s, re.I)
请参阅regex demo和this Python demo。
模式详情
\b
- 一个单词边界(将january
作为整个单词匹配)([^\W\d_]{3})
- 第1组:正好是3个字母(j(?:an|u[nl])|feb|ma[ry]|a(?:pr|ug)|sep|oct|nov|dec)
- 任何英文月份名称的前3个字母\w*
- 0+ word chars \s+
- 一个或多个空格([0-9]{4})
- 第2组:四位ASCII数字\b
- 一个单词边界(以便匹配的四位数字后面不能跟一个字母,数字或_
)。使用"{} {}".format(m.group(1),m.group(2)
,jan
和4位数字会连接到所需的结果中。
答案 1 :(得分:0)
如果我理解正确,你不想忽略所有字母,而只忽略其中一些字母。
你的表情非常接近。 您可以使用此表达式捕获您想要的内容(您捕获将它放在()之间的内容:
(jan).*(\d{4})
并使用此
恢复捕获的内容.group(1) .group(2)