正则表达式,用于匹配两个数字和除新行和d以外的所有内容

2024-04-25 03:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

使用pythonv3,我试图找到一个字符串,只有当它包含一到两个数字(并且不再是同一个数字中的数字)以及它后面的所有其他数字。比赛在句号或新行上中断。你知道吗

\d{1,2}[^.\n]+几乎正确,只是它返回的数字大于两位数。你知道吗

例如:

"5+years {} experience. stop. 

10 asdasdas   . 255 

1abc1 

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

应返回:

5+years {} experience

10 asdasdas   

1abc1

Tags: 字符串数字experiencestopjn两位数years句号
1条回答
网友
1楼 · 发布于 2024-04-25 03:54:03

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

^\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)放在regex(也称为inline修饰符)的开头之前,或者通过将第三个参数传递给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']

相关问题 更多 >