擅长:python、mysql、java
<p>首先要回答第二个问题,不,字符类不是一个组(除非通过将它放在括号中显式地将其变成一个组)</p>
<p>关于第一个问题,即如何使其排除结尾处的标点符号,下面的代码应该能回答这个问题</p>
<p>不过,首先,您的正则表达式有一个与匹配最终标点符号的事实不同的问题,即最后一个<code>-</code>似乎不是用来定义字符范围的(请参见下面的脚注,了解我为什么认为是这样),而是这样做的。为了避免这个问题,我把它移到了角色类的末尾</p>
<p>现在,在regexp的末尾添加了一个与最终字符匹配的字符类,该字符类与前面的字符类相同,只是它不包括<code>.</code>(其他标点现在已经不包括)。因此,匹配的模式不能以<code>.</code>结尾。上一个字符类上的<code>+</code>(一个或多个)现在减少为<code>*</code>(零个或多个)</p>
<p>如果出于任何原因,需要对匹配的字符集进行调整,那么仍然可以使用相同的原则:在减少的可能性集的末尾匹配单个字符,前面是更大的集合中的任意数量的字符,其中包括允许包含但不在末尾的字符</p>
<pre><code>import re
webURLregex = re.compile(r'''(
(https://|http://)
[a-zA-Z0-9.%+\\/_-]*
[a-zA-Z0-9%+\\/_-]
)''',re.VERBOSE)
str = "... at http://www.google.com/. It says"
m = re.search(webURLregex, str)
if m:
print(m.group())
</code></pre>
<p>产出:</p>
<pre><code>http://www.google.com/
</code></pre>
<p>[*]<em>第二个<code>-</code>似乎不打算定义字符范围的观察结果是基于这样一个事实,即如果是,那么该范围将是从056-134(八进制)开始的,这也将包括字母字符,使得<code>a-zA-Z</code>冗余</em></p>