Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,我需要一个正则表达式,将匹配重复(不止一个)标点和符号。基本上所有重复的非字母数字和非空白字符,如…、??、!!!、###、@@@、++等等。它必须是重复的同一个字符,所以不是像“!?@”这样的序列 我尝试了[^\s\w]+,虽然这涵盖了所有的!!!、??、$$案例,但这给了我比我想要的更多,因为它也将匹配“!?@” 有人能告诉我吗?谢谢。试试这个模式: ([.\?#@+,<>%~`!$^&\(\):;])\1+ ([.\?\@+,%~`!$^&\(\):;])\1+ \

我需要一个正则表达式,将匹配重复(不止一个)标点和符号。基本上所有重复的非字母数字和非空白字符,如…、??、!!!、###、@@@、++等等。它必须是重复的同一个字符,所以不是像“!?@”这样的序列

我尝试了[^\s\w]+,虽然这涵盖了所有的!!!、??、$$案例,但这给了我比我想要的更多,因为它也将匹配“!?@”

有人能告诉我吗?谢谢。

试试这个模式:

([.\?#@+,<>%~`!$^&\(\):;])\1+
([.\?\@+,%~`!$^&\(\):;])\1+
\1
指的是第一个匹配的组,即括号中的内容

您需要根据需要扩展标点和符号列表。

尝试以下模式:

([.\?#@+,<>%~`!$^&\(\):;])\1+
([.\?\@+,%~`!$^&\(\):;])\1+
\1
指的是第一个匹配的组,即括号中的内容


您需要根据需要扩展标点和符号列表。

编辑:@Firoze-Lafeer发布了一个答案,该答案使用单个正则表达式完成所有操作。如果有人对将正则表达式与过滤函数相结合感兴趣,我将保留这个选项,但是对于这个问题,使用Firoze Lafeer的答案会更简单、更快

在我看到菲罗兹·拉菲尔的答案之前写的答案如下,不变

一个简单的正则表达式不能做到这一点。经典的精辟总结是“正则表达式不能计数”。在此讨论:

对于Python解决方案,我建议将正则表达式与少量Python代码相结合。正则表达式抛出不是某种标点符号的所有内容,然后Python代码进行检查以抛出错误匹配(标点符号的匹配,但不完全相同的字符)

我编写了
all\u same()
,这样它在迭代器和字符串上都能正常工作。Python内置的
all()
为空序列返回
True
,这不是我们在使用
all\u same()
时想要的,因此我为所需的基本情况设置了一个参数,并将其默认为
True
,以匹配
all()
的行为

这将使用Python内部(正则表达式引擎或
all()
)完成尽可能多的工作,因此速度应该相当快。对于大型输入文本,您可能需要重写
find_all\u punct\u runs()
以使用
re.finditer()
而不是
re.findall()
。我举了一个例子。该示例还返回生成器表达式而不是列表。您始终可以强制它制作一个列表:

lst = list(find_all_punct_runs(text))

编辑:@Firoze-Lafeer发布了一个答案,它用一个正则表达式完成所有事情。如果有人对将正则表达式与过滤函数相结合感兴趣,我将保留这个选项,但是对于这个问题,使用Firoze Lafeer的答案会更简单、更快

在我看到菲罗兹·拉菲尔的答案之前写的答案如下,不变

一个简单的正则表达式不能做到这一点。经典的精辟总结是“正则表达式不能计数”。在此讨论:

对于Python解决方案,我建议将正则表达式与少量Python代码相结合。正则表达式抛出不是某种标点符号的所有内容,然后Python代码进行检查以抛出错误匹配(标点符号的匹配,但不完全相同的字符)

我编写了
all\u same()
,这样它在迭代器和字符串上都能正常工作。Python内置的
all()
为空序列返回
True
,这不是我们在使用
all\u same()
时想要的,因此我为所需的基本情况设置了一个参数,并将其默认为
True
,以匹配
all()
的行为

这将使用Python内部(正则表达式引擎或
all()
)完成尽可能多的工作,因此速度应该相当快。对于大型输入文本,您可能需要重写
find_all\u punct\u runs()
以使用
re.finditer()
而不是
re.findall()
。我举了一个例子。该示例还返回生成器表达式而不是列表。您始终可以强制它制作一个列表:

lst = list(find_all_punct_runs(text))

我会这样做:

>>> st='non-whitespace characters such as ..., ???, !!!, ###, @@@, +++ and' 
>>> reg=r'(([.?#@+])\2{2,})'
>>> print [m.group(0) for m in re.finditer(reg,st)]

其中一个打印:

['...', '???', '###', '@@@', '+++']

我会这样做:

>>> st='non-whitespace characters such as ..., ???, !!!, ###, @@@, +++ and' 
>>> reg=r'(([.?#@+])\2{2,})'
>>> print [m.group(0) for m in re.finditer(reg,st)]

其中一个打印:

['...', '???', '###', '@@@', '+++']

我想你在找这样的东西:

[run for run,leadchar在re.findall(r'([^\w\s])\2+,yourstring)]

例如:

In : teststr = "4spaces    then(*(@^#$&&&&(2((((99999****"

In : [run for run, leadchar in re.findall(r'(([^\w\s])\2+)',teststr)]
Out: ['&&&&', '((((', '****']
这将为您提供一个运行列表,不包括该字符串中的4个空格以及类似“*(@^”的序列


如果这不完全是您想要的,您可以使用示例字符串编辑您的问题,并精确显示您想要查看的输出。

我想您正在寻找类似以下内容:

[run for run,leadchar在re.findall(r'([^\w\s])\2+,yourstring)]

例如:

In : teststr = "4spaces    then(*(@^#$&&&&(2((((99999****"

In : [run for run, leadchar in re.findall(r'(([^\w\s])\2+)',teststr)]
Out: ['&&&&', '((((', '****']
这将为您提供一个运行列表,不包括该字符串中的4个空格以及类似“*(@^”的序列


如果这不完全是您想要的,您可以使用示例字符串编辑您的问题,并精确地编辑您想要查看的输出。

s/O是在代码问题上提供帮助-不是为您编写代码-查看
re
的文档并进行尝试/O是在代码问题上提供帮助-不是为您编写代码-查看
re
的文档具有Python不支持的尝试AFAIK。也就是说,
\p{p}
\p{S}
。反引用部分是。Python不支持AFAIK。也就是说,
\p{p}
\p{S}
。反引用部分是。
-
[/code>(不确定Python)和
]
在c语言中是特殊的