Python 在嘈杂的文本中查找标点符号

Python 在嘈杂的文本中查找标点符号,python,regex,string,Python,Regex,String,我有一些标点符号用法很糟糕的句子,例如: 有些人做得对;有些人忘记了空格;有的加错了,;真烦人!;) 我需要知道每个“真正的”标点符号的位置,特别是排除它们在文本表情符号中的使用。如果我使用: >>> print re.findall(r'\w+\s*(;)\s*\w+', s) [';', ';', ';'] 因此,我正确匹配分号,但在字符串中没有分号的位置。但是,当我使用finditer时: >>> p = re.compile(r'\w+\s*(;)

我有一些标点符号用法很糟糕的句子,例如:

有些人做得对;有些人忘记了空格;有的加错了,;真烦人!;)
我需要知道每个“真正的”标点符号的位置,特别是排除它们在文本表情符号中的使用。如果我使用:

>>> print re.findall(r'\w+\s*(;)\s*\w+', s)
[';', ';', ';']
因此,我正确匹配分号,但在字符串中没有分号的位置。但是,当我使用
finditer
时:

>>> p = re.compile(r'\w+\s*(;)\s*\w+')
>>> for m in p.finditer(s):
...    print m.group(), m.span()
right; some (18, 29)
whitespace;some (39, 54)
one ; pretty (67, 79)
正确地说,我得到了整个匹配组。当我用天真的方法

>>> p = re.compile(r';')
>>> for m in p.finditer(s):
...     print m.group(), m.span()
; (23, 24)
; (49, 50)
; (71, 72)
; (90, 91)
我得到了所有“真实”标点符号的位置,但也是
;)的一部分。)表情符号

该示例仅使用
,但它可以是各种标点符号:
,;:。而且,我不必担心十进制数

当然,我可以将
\w+
更改为
[a-zA-Z]+
,但这会干扰以数字结尾的句子,例如,
答案是42。


我想我可以将这种简单的方法应用于各个组,但也许有一种更简单的方法可以做到这一点。

在没有参数的情况下调用时,会返回整个匹配。在正则表达式模式中,包含
的组可以称为1

调用组名作为参数的match对象的
start
方法:

for m in p.finditer(s):
    print(m.start(1), s[m.start(1)])
输出

23 ;
49 ;
71 ;
考虑指定一个符号组名,您可以使用它来代替1,例如

p = re.compile(r'\w+\s*(?P<semicolon>;)\s*\w+')
for m in p.finditer(s):
    print(m.start('semicolon'), s[m.start('semicolon')])
p=re.compile(r'\w+\s*(?p;)\s*\w+)
对于p.finditer中的m:
打印(m.start('分号'),s[m.start('分号'))

输出是相同的。

您可能应该使用适当的软件包来完成这项工作。您假定smiley是明确的,即使您的问题陈述是针对文本中的错误。这似乎不可能可靠地实现。另外,有些人(比如我自己:-)用笑脸折叠右括号。我正在使用一种相对灵活的基于正则表达式的方法来识别文本表情<代码>:-)
:0)))
;o) 
[-:
}=:
;D
,…都可以。但是,这种灵活性带来的代价是,找到标点符号不再是一件小事。现在我遇到了一个坏情况,当一个句子后面有一个表情符号时,例如,
,对吗?;)
。问号与我当前的正则表达式模式不匹配。但是你是是的,我认为它永远不会100%准确。这很有效!我完全错过了引用包含标点符号的组的机会。vaultah,谢谢!@Christian没问题,我很高兴我正确理解了你的问题:)