Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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,我正在寻找一个正则表达式,它可以区分包含括号内数值的字符串和包含括号外数值的字符串。问题是,括号可能相互嵌入: 例如,表达式应匹配以下字符串: 嘿(例1) 还有(这个(onetoo2(硬))) 但是(这里是一个(更难的)可能是23)呵呵) 但它不应与以下任何一项匹配: 这(一)是错误的 如何(继续)与(多个)3方(Hesse(周围)) 到目前为止我已经试过了 \d[A-Za-z]\) 像这样简单的事情。这一个的问题是它与示例2不匹配,因为它后面有一个(字符串) 我如何解决这个问题呢?这些

我正在寻找一个正则表达式,它可以区分包含括号内数值的字符串和包含括号外数值的字符串。问题是,括号可能相互嵌入:

例如,表达式应匹配以下字符串:

  • 嘿(例1)
  • 还有(这个(onetoo2(硬)))
  • 但是(这里是一个(更难的)可能是23)呵呵)
但它不应与以下任何一项匹配:

  • 这(一)是错误的
  • 如何(继续)与(多个)3方(Hesse(周围))
到目前为止我已经试过了

\d[A-Za-z]\)

像这样简单的事情。这一个的问题是它与示例2不匹配,因为它后面有一个(字符串)


我如何解决这个问题呢?

这些类型的正则表达式并不总是那么容易,但有时只要输入保持一定的一致性,就有可能找到一种方法。通常这样的模式应该可以工作:

(.*(\([\d]+[^(].*\)|\(.*[^)][\d]+.*\)).*)
代码

import re

p = re.compile(ur'(.*(\([\d]+[^(].*\)|\(.*[^)][\d]+.*\)).*)', re.MULTILINE)

result = re.findall(p, searchtext)
print(result)
结果

import re

p = re.compile(ur'(.*(\([\d]+[^(].*\)|\(.*[^)][\d]+.*\)).*)', re.MULTILINE)

result = re.findall(p, searchtext)
print(result)

问题不在于模式匹配。这意味着正则表达式不是实现这一点的合适工具

相反,你需要词法分析和解析


你可以试试or库。

在我看来,你正在寻找一个lexer和parser.eeg flex和bison.In string
如何(继续)使用(多个)3parent(heses(around))
数字已经被外部的
()
包围了。你有什么规则来区分它与
但是(这里是(更难的)一个)可能是23)呵呵)?因为两者看起来相似。应该很难使用正则表达式,因为即使检测正确的括号嵌套也超出了FSA和常规语言的范围。它是上下文无关的。嵌套括号是难以用正则表达式处理的典型例子;考虑不同的方法。它可能更容易。只计算数字前的开括号和闭括号的数量。正如上面的评论中所提到的,正则表达式不是最好的方法。我认为这将在
hello(1(世界))上失败
这应该与OPs描述相匹配。是的,很可能,但模式可以适应。希望他们能从中吸取一些教训……这就是目标。谢谢。