使用python v3,我尝试仅在字符串包含一到两个数字(并且不超过相同数字的字符串)以及其后的所有其他字符的情况下查找字符串。比赛在句点或换行符处中断。
\d{1,2}[^.\n]+
除了返回大于两位数的数字外,几乎是正确的。
例如:
"5+years {} experience. stop.
10 asdasdas . 255
1abc1
5555afasfasf++++s()(jn."
应返回:
5+years {} experience
10 asdasdas
1abc1
答案 0 :(得分:2)
根据您的描述和示例数据,您可以使用以下正则表达式来匹配预期的字符串并丢弃其他字符串,
^\d[^\d.]*\d?[^\d.\n]*(?=\.|$)
正则表达式说明
^
-行首\d
-匹配数字[^\d.]*
-与数字或点以外的任何字符匹配零次或多次。基本上,这可以选择匹配非数字非点字符。\d?
-您想允许一两位数字,这是第二个数字,是可选的,因此\d
后跟?
[^\d.\n]*
-匹配数字,点或换行符以外的任何字符(?=\.|$)
-这种积极向上的眼光确保比赛以点或线尾结束另外,请注意,启用了多行模式,因为^
和$
需要匹配行首和行尾。ad
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
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