Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式-要求\d+;中包含特定数字;?_Python_Regex - Fatal编程技术网

Python 正则表达式-要求\d+;中包含特定数字;?

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

考虑python代码:

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