Python 正则表达式-要求\d+;中包含特定数字;?
考虑python代码:Python 正则表达式-要求\d+;中包含特定数字;?,python,regex,Python,Regex,考虑python代码: import re re.findall('[0-9]+', 'XYZ 102 1030') 返回: ['102', '1030'] 是否可以编写一个正则表达式,该正则表达式要求至少出现一个数字3,即我对'[0-9]+'感兴趣,其中至少有一个3?因此,利息的结果将是: ['1030'] 更一般地说,至少是n3 更一般地说,至少n3,至少k4,等等如何?字符串中至少可以有一个3 \d*3\d* 如果您正在查找(至少)2倍于3的内部数字,您可以使用: \d*3\d
import re
re.findall('[0-9]+', 'XYZ 102 1030')
返回:
['102', '1030']
是否可以编写一个正则表达式,该正则表达式要求至少出现一个数字3
,即我对'[0-9]+'
感兴趣,其中至少有一个3
?因此,利息的结果将是:
['1030']
更一般地说,至少是n
3
更一般地说,至少
n
3
,至少k
4
,等等如何?字符串中至少可以有一个3
\d*3\d*
如果您正在查找(至少)2倍于3
的内部数字,您可以使用:
\d*3\d*3\d*
如果您希望(至少)n
次,您可以使用:
只需尝试regexp
“\d*3\d*”
,它的意思是“0或更多数字,后跟一个3,后跟0或更多数字”
你可以
如果您想要“至少'n'3”,请使用'\d*(3\d*){n}'
对于x
的n次出现,以及y
的m次出现,依此类推,在这个通用表达式的基础上:
(?=(?:\d*x){n})(?=(?:\d*y){m})\b\d+\b
其中,对于每个所需的n
和x
重复先行部分(?=(?:\d*x){n})
我选择用(?:…)
包围前瞻组,使其不被捕获,尽管这会使其可读性降低一点
计数部分本身就是(\d*x){n}
,它需要一个前瞻,因为要查找多组数字,数字可能以任何顺序出现
最后一个\b\d+\b
确保只捕获由“not word”字符包围的数字,因此它将跳过任何包含字母的序列,但将处理类似于abc-123-456
的内容
示例:XYZ 1023344a 1403403中的2 3和2 4
(?=(?:\d*3){2})(?=(?:\d*4){2})\b\d+\b
将匹配1403403
,但不匹配1023344a
看
尽管您可以使用正则表达式进行此操作,但当您搜索多个不同的数字时,正则表达式会变得混乱且难以读取。相反,您可以使用来计算字符串中每个字符的出现次数:
from collections import Counter
# Must contain at least two 3s, three 4s, and one 7
mins = { '3': 2, '4': 3, '7': 1 }
input = '3444 33447 334447 foo334447 473443 2317349414'
tokens = input.split()
for token in tokens:
# Skip tokens that aren't numbers
if not token.isdigit():
continue
counter = Counter(token)
for digit, min_count in mins.items():
if counter[digit] < min_count:
break
else:
print(token)
我投票支持不使用我在回答中使用的组(
[3]
)@aragaer,你是对的。我刚刚对joanolo的答案投了赞成票:)我可以更新答案…@aragaer:你也可以在上一个例子的末尾保存你的\d*
;它已经在parens中了。@joanolo我想现在答案更好了。你只想匹配所有数字的标记吗?例如,foo3bar
包含一个3;你想匹配它吗?有任何答案解决了你的问题吗?你还没有对他们中的任何人发表评论。。。
from collections import Counter
# Must contain at least two 3s, three 4s, and one 7
mins = { '3': 2, '4': 3, '7': 1 }
input = '3444 33447 334447 foo334447 473443 2317349414'
tokens = input.split()
for token in tokens:
# Skip tokens that aren't numbers
if not token.isdigit():
continue
counter = Counter(token)
for digit, min_count in mins.items():
if counter[digit] < min_count:
break
else:
print(token)
334447
473443
2317349414