正则表达式用于匹配两位数和除换行和点外的所有内容

时间:2019-05-04 16:29:37

标签: python regex

使用python v3,我尝试仅在字符串包含一到两个数字(并且不超过相同数字的字符串)以及其后的所有其他字符的情况下查找字符串。比赛在句点或换行符处中断。

\d{1,2}[^.\n]+除了返回大于两位数的数字外,几乎是正确的。

例如:

"5+years {} experience. stop. 

10 asdasdas   . 255 

1abc1 

5555afasfasf++++s()(jn."

应返回:

5+years {} experience

10 asdasdas   

1abc1

2 个答案:

答案 0 :(得分:2)

根据您的描述和示例数据,您可以使用以下正则表达式来匹配预期的字符串并丢弃其他字符串,

^\d[^\d.]*\d?[^\d.\n]*(?=\.|$)

正则表达式说明

  • ^-行首
  • \d-匹配数字
  • [^\d.]*-与数字或点以外的任何字符匹配零次或多次。基本上,这可以选择匹配非数字非点字符。
  • \d?-您想允许一两位数字,这是第二个数字,是可选的,因此\d后跟?
  • [^\d.\n]*-匹配数字,点或换行符以外的任何字符
  • (?=\.|$)-这种积极向上的眼光确保比赛以点或线尾结束

另外,请注意,启用了多行模式,因为^$需要匹配行首和行尾。ad

Regex Demo 1

代码:

import re

s = '''5+years {} experience. stop.

10 asdasdas . 255

1abc1

5555afasfasf++++s()(2jn.'''

print(re.findall(r'(?m)^\d[^\d.]*\d?[^\d.\n]*(?=\.|$)', s))

打印:

['5+years {} experience', '10 asdasdas ', '1abc1']

此外,如果匹配的行不一定以数字开头,则可以使用此正则表达式捕获所需的字符串,但是如果要捕获的字符串仅以数字开头,并且需要,则需要从group1获取字符串字符串不一定必须以数字开头,那么您可以捕获整个匹配项。

^[^\d\n]*(\d[^\d.]*\d?[^\d.\n]*)(?=\.|$)

正则表达式说明

  • ^-行首
  • [^\d\n]*-允许在第一位数字之前输入零个或多个非数字字符
  • (-开始第一个分组模式以捕获以第一个数字开头的字符串
  • \d-匹配数字
  • [^\d.]*-与数字或点以外的任何字符匹配零次或多次。基本上,这可以选择匹配非数字非点字符。
  • \d?-您想允许一两位数字,这是第二个数字,是可选的,因此\d后跟?
  • [^\d.\n]*-匹配数字,点或换行符以外的任何字符
  • `)-第一个捕获模式的结束
  • (?=\.|$)-这种积极向上的眼光确保比赛以点或线尾结束

启用多行模式,您可以通过以下方式启用该模式:将(?m)放在正则表达式(也称为内联修饰符)开始之前,或者将第三个参数作为re.search传递给re.MULTILINE

Regex Demo 2

代码:

import re

s = '''5+years {} experience. stop.

10 asdasdas . 255

1abc1

aaa1abc1

aa2aa1abc1

5555afasfasf++++s()(2jn.'''

print(re.findall(r'(?m)^[^\d\n]*(\d[^\d.]*\d?[^\d.\n]*)(?=\.|$)', s))

打印:

['5+years {} experience', '10 asdasdas ', '1abc1', '1abc1']

答案 1 :(得分:0)

类似的事情可以满足您的需求:

^(\"|\'|)\d{1,2}\D[^.\n]+

适用于此:

"5+years {} experience. stop. 

10 asdasdas   . 255 

1abc1 

512abcd

5555afasfasf++++s()(2jn."

返回:

"5+years {} experience

10 asdasdas   

1abc1 

Regex Demo