【问题标题】:Regex for Text Between Brackets and Text Between Semicolons括号之间的文本和分号之间的文本的正则表达式
【发布时间】:2019-05-17 07:34:26
【问题描述】:

我有以下形状的字符串:PW[Yasui Chitetsu];并且只想得到括号内的名称:Yasui Chitetsu。我正在尝试类似的东西

[^(PW\[)](.*)[^\]]

作为正则表达式,但最后一个括号仍在其中。如何取消选择它?对于这种情况,我认为我不需要任何花哨的东西,比如看背后等。

【问题讨论】:

  • 其实你的问题是反过来的。此正则表达式匹配 asui Chitets
  • 看起来您可以将正则表达式大量简化为PW\[(.*)\],在这种情况下将匹配Yasui Chitetsu
  • @DeepSpace, PW\[(.*)\] 在 Python 中给了我完整的 PW[Yasui Chitetsu],当我在 Atom 中尝试它时。您是否使用其他一些正则表达式标准?
  • @PhilippeFanaro 如果您使用的是matchsearch,那么您应该获得第一组,即re.match(r'PW\[(.*)\]', 'PW[Yasui Chitetsu]').group(1)

标签: python regex


【解决方案1】:

你尝试过的问题

您的尝试存在一些问题:

  • 它会从组中省略匹配的第一个和最后一个字符,给你类似asui Chitets
  • PW 开头的字符串会出现更多错误。例如,在PW[Paul McCartney] 中,您将仅将ul McCartne 与组匹配,将ul McCartney 与完整匹配。

正则表达式

你想要这样的东西:

(?<=\[)([^]]+)(?=\])

这是regex101 demo

说明

(?&lt;=\[) 表示匹配前必须有[

([^]]+) 匹配 1 个或多个不是 ] 的字符

(?=\])表示匹配后必须跟]

示例代码

这是一些示例代码(来自上面的 regex101 链接):

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(?<=\[)([^]]+)(?=\])"

test_str = "PW[Yasui Chitetsu]"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches):
    matchNum = matchNum + 1

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

分号

在您的标题中,您提到在分号之间查找文本。同样的逻辑也适用,给你这个正则表达式:

(?<=;)([^;]+)(?=;)

【讨论】:

  • 为什么这么复杂? PW\[(.*)\]
  • 很好,非常感谢。分号是另一个代码中的类似问题。您提到的教程似乎也很有帮助。
  • @DeepSpace 因为 OP 没有指定 PW 必须是常量或者字符串中只有一个这样的组。我的例子很笼统。您的示例会继续,例如 AB[Yasui Chitetsu]PW[Yasui Chitetsu] something PW[Another Name]。最好在更精确方面犯错。
  • @PhilippeFanaro 很高兴它有帮助!请记住接受答案。 :)
  • 两种解决方案都适用于我的情况(实际上括号前有一些带有不同前缀的行),但 Ed 的似乎确实更好。谢谢你们两个。
猜你喜欢
  • 1970-01-01
  • 2016-07-21
  • 2011-06-21
  • 1970-01-01
  • 2020-03-14
  • 2011-05-16
  • 2011-01-25
相关资源
最近更新 更多