Python连续多次匹配正则表达式(不是findall方式)

Posted

技术标签:

【中文标题】Python连续多次匹配正则表达式(不是findall方式)【英文标题】:Python matching regex multiple times in a row (not the findall way) 【发布时间】:2015-07-03 10:22:46 【问题描述】:

这个问题不是询问在字符串中多次查找“a”等。

我想做的是匹配:

[ a-zA-Z0-9]1,3\.

regexp 多次,其中一种方法是使用 |

'[ a-zA-Z0-9]1,3\.[ a-zA-Z0-9]1,3\.[ a-zA-Z0-9]1,3\.[ a-zA-Z0-9]1,3\.|[ a-zA-Z0-9]1,3\.[ a-zA-Z0-9]1,3\.[ a-zA-Z0-9]1,3\.|[ a-zA-Z0-9]1,3\.[ a-zA-Z0-9]1,3\.'

所以这匹配正则表达式 4 或 3 或 2 次。 匹配以下内容:

a. v. b.
m a.b.

有什么办法可以让这个更像编码?

我试过了

([ a-zA-Z0-9]1,3\.)2,4 

但功能与我预期的不一样。这个匹配:

regex.findall(string)
[u' b.', u'b.']

字符串是:

a. v. b. split them a.b. split somethinf words. THen we say some more words, like ten

有没有办法做到这一点?目标是匹配可能的英文缩写和名称,如 Mary J. E. 句子标记器识别为句子标点符号但不是的东西。

我想匹配所有这些:

U.S. , c.v.a.b. , a. v. p. 

【问题讨论】:

你能给我们举个例子吗? regex101.com/r/qO1fX2/1 没有任何问题 它只匹配 d23。我想匹配您示例中的整个字符串:aa2.jhf.jev.d23.llo. >>> s="aa2.jhf.jev.d23.llo." >>> re.search(r'([ a-zA-Z0-9]1,3\.)2,4',s).group(0) 'aa2.jhf.jev.d23.' @Kasra 我不明白你的回复 【参考方案1】:

首先,您的正则表达式将按您的预期工作:

>>> s="aa2.jhf.jev.d23.llo."
>>> import re
>>> re.search(r'([ a-zA-Z0-9]1,3\.)2,4',s).group(0)
'aa2.jhf.jev.d23.'

但是如果你想匹配一些像U.S. , c.v.a.b. , a. v. p. 这样的子字符串,你需要将整个正则表达式放在一个捕获组中:

>>> s= 'a. v. b. split them a.b. split somethinf words. THen we say' some more 
>>> re.findall(r'(([ a-zA-Z0-9]1,3\.)2,4)',s)
[('a. v. b.', ' b.'), ('m a.b.', 'b.')]

然后使用列表推导获取第一个匹配项:

>>> [i[0] for i in re.findall(r'(([ a-zA-Z0-9]1,3\.)2,4)',s)]
['a. v. b.', 'm a.b.']

【讨论】:

以上是关于Python连续多次匹配正则表达式(不是findall方式)的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配一个或两个引号,但不是连续三个

JS正则表达式从入门到入土—— 量词

正则表达式学习整理

正则表达式

Python 正则表达式规则

python 正则表达式