Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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中的正则表达式_Python_Regex - Fatal编程技术网

Python中的正则表达式

Python中的正则表达式,python,regex,Python,Regex,我不知道如何使用正则表达式查找字符串,字符串的格式如下 [任意符号0~n次任意数字1~n次]1~n次 电话号码似乎是匹配的。但区别在于,例如,可以在数字之间插入任何符号和空格 458###666###2##111####111 OR (123)))444###555%%6222%%%% 我不知道我是否清楚地解释了这个问题。 无论如何,感谢您的回复。如果需要从字符串中收集所有数字组,您可以使用\d+regex: >>> re.findall('\d+', '458###666#

我不知道如何使用正则表达式查找字符串,字符串的格式如下

[任意符号0~n次任意数字1~n次]1~n次

电话号码似乎是匹配的。但区别在于,例如,可以在数字之间插入任何符号和空格

458###666###2##111####111
OR
(123)))444###555%%6222%%%%
我不知道我是否清楚地解释了这个问题。
无论如何,感谢您的回复。

如果需要从字符串中收集所有数字组,您可以使用
\d+
regex:

>>> re.findall('\d+', '458###666###2##111####111 OR (123)))444###555%%6222%%%%')
['458', '666', '2', '111', '111', '123', '444', '555', '6222']

我认为这代表了你描述的模式

^(?:(\D?)\1*\d+)+$
看到了吗

^
匹配字符串的开头

(\D?\1*
将匹配可选的非数字(
\D
),将其放入反向引用中,并使用
\1*
再次匹配该字符0次或多次

\d+
至少1位

(?:(\D?)\1*\D+
完整的非捕获组重复1次或多次

$
匹配字符串的结尾

它会匹配的

458####666###2###111###111
(123))444###555%%6222%%%1
((((()((123)))444(555%%6222%%%1

但不是

s(123)))444###555%%6222%%%1
(123)))444##555%%6222%%

你的声明:

[任意符号0~n次任意数字1~n次]1~n次


不适用于第二个不以数字结尾的示例444###555%%6222%%%。

[注意,我忽略了“in python”,而是选择了一个更一般的“build regular expressions”答案,希望这不仅能提供所需的答案,而且能为不同的相关问题提供一些帮助]

首先,您希望匹配任何符号(或可能是任何符号,数字除外)0次或更多次。这可能是
*
[^0-9]*
中的一次(第一次是“任何通配符”,第二次是除数字0到9之外的所有字符的字符类。
*
是“至少不匹配次数”

第二,你想匹配一个或多个数字。这也相对容易:
[0-9]+
(或者如果你有一个足够古老的数据库,
[0-9][0-9]*
,但在CS考试之外,这种情况很难发生)

第三,您希望将其分组,并至少重复分组一次


分组的一般语法是将组括在括号中(emacs除外,在emacs中,您需要\(,因为普通括号经常匹配)。因此,类似于
([^0-9]*[0-9]+)+
的方法应该可以解决这个问题。

我不理解这个问题