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