如何纠正正则表达式中的不平衡括号错误?

Posted

技术标签:

【中文标题】如何纠正正则表达式中的不平衡括号错误?【英文标题】:How to correct unbalanced parenthesis error in regular expression? 【发布时间】:2019-09-16 05:09:07 【问题描述】:

我正在通过 Al Sweigart 的自动化 udemy 上无聊的东西课程第 29 课来学习正则表达式。我收到一条错误消息:“位置 414 的括号不平衡(第 12 行,第 1 列)”

该代码旨在使用正则表达式提取电话号码和电子邮件地址。

我已经尝试计算括号并为电子邮件正则表达式取出顶部和底部括号。

#! python3

import re, pyperclip

# Done - TODO: create a regex object for phone numbers
phoneRegex = re.compile(r'''
# Types of number 415-555-0000, 555-0000, (415) 555-0000, 555-0000 ext 12345,
# ext. 12345, x12345
(
((\d\d\d) | (\(\d\d\d\)))?            # area code (optional)
(\s|-)            # first separator
\d\d\d            # first 3 digits
-            # separator
\d\d\d\d            # last 4 digits
((ext(\.)?\s)|x)           # extension word part (optional)
(\d2,5))?             # extension number part (optional)
)
''', re.VERBOSE)

# TODO: Create a regex for email addresses
emailRegex = re.compile (r'''
# some.+_thing@(\d2,5))?.com

[a-zA-Z0-9_.+]+         # name part - created non default regular   expression class
# to capture any character a-z lowercase, A-Z upper case, numbers 0-9, characters _.+
@        # @ symbol
[a-zA-Z0-9_.+]+        # domain name part

''', re.VERBOSE)

# TODO: Get the text off the clipboard
text = pyperclip.paste()

# TODO: Extract the email/phone from this text
extractedPhone = phoneRegex.findall(text) # creates one string for each group ()
# Make sure desired regex is all in one group ()
extractedEmail = emailRegex.findall(text)

print (extractedPhone)# temporary print function to see if code works
print (extractedEmail)

给出这个错误:

Traceback(最近一次调用最后一次): 文件“C:\Users*\Desktop\Education\computer science\自动化无聊的东西\programs\lesson 29 phone and email regex.py”,第 18 行, 在 ''', re.VERBOSE) 文件“C:\Users*\AppData\Local\Programs\Python\Python37\lib\re.py”,行 234,在编译中 返回_compile(模式,标志) 文件“C:\Users*\AppData\Local\Programs\Python\Python37\lib\re.py”,行 286,在_编译 p = sre_compile.compile(模式,标志) 文件“C:\Users*\AppData\Local\Programs\Python\Python37\lib\sre_compile.py”, 第 764 行,在编译中 p = sre_parse.parse(p, 标志) 文件“C:\Users*\AppData\Local\Programs\Python\Python37\lib\sre_parse.py”, 第 944 行,解析中 raise source.error("不平衡括号") re.error:位置 414 处的不平衡括号(第 12 行,第 1 列)

【问题讨论】:

【参考方案1】:

您需要修复此行(\d2,5))? # extension number part (optional)。显然它需要添加/删除括号。

将该行更改为(\d2,5)? 将修复unbalanced parenthesis 错误。

【讨论】:

@neoraiden 让我知道此更改是否适合您。谢谢 它纠正了括号错误谢谢,但正则表达式的电话号码部分没有找到数字,所以我现在正在尝试解决这个问题。 我最初在第 15 行第 1 列 # 扩展词部分缺少括号,我需要数字正则表达式工作并平衡括号。 我最初在第 15 行第 1 列 # 扩展词部分缺少括号,我需要数字正则表达式工作并平衡括号。【参考方案2】:

请注意会导致的不平衡 可能会让您知道如何解决它。

     # Types of number 415-555-0000, 555-0000, (415) 555-0000, 555-0000 ext 12345,
     # ext. 12345, x12345
     (                             # (1 start)
          (                             # (2 start), area code (optional)
               ( \d\d\d )                    # (3)
            |  ( \( \d\d\d \) )              # (4)
          )?                            # (2 end)
          ( \s | - )                    # (5), first separator
          \d\d\d                        # first 3 digits
          -                             # separator
          \d\d\d\d                      # last 4 digits
          (                             # (6 start), extension word part (optional)
               (                             # (7 start)
                    ext
                    ( \. )?                       # (8)
                    \s
               )                             # (7 end)
            |  x
          )                             # (6 end)
          ( \d2,5 )                   # (9), extension number part (optional)
     )?                            # (1 end)
=    )  <-- Unbalanced  ')'

【讨论】:

以上是关于如何纠正正则表达式中的不平衡括号错误?的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中,我需要一个正则表达式来匹配电话号码中的平衡括号 /^([1]0,1)\s?\(?\d3\)?[-\s]?\d 3[-\s]?\d4$/

正则表达式中 如何取出所有组中的值?

正则表达式如何匹配提取括号中的内容

如何用正则表达式匹配括号中的内容,不包含括号

如何使用正则表达式删除字符串中的括号符号

使用 RegEx 平衡匹配括号