【问题标题】:Regex find non digit and/or end of string正则表达式查找非数字和/或字符串结尾
【发布时间】:2010-12-02 09:45:50
【问题描述】:

如何在 python 2.6 正则表达式集中包含一个字符串结尾和一个非数字字符以进行搜索?

我想找到 10 位数字,开头是非数字,结尾是非数字或字符串结尾。它是一个 10 位的 ISBN 号,“X”对最后一位有效。

以下方法不起作用:

is10 = re.compile(r'\D(\d{9}[\d|X|x])[$|\D]')
is10 = re.compile(r'\D(\d{9}[\d|X|x])[\$|\D]')
is10 = re.compile(r'\D(\d{9}[\d|X|x])[\Z|\D]')

问题出现在最后一组:[\$|\D] 匹配非数字或字符串结尾。

测试:

line = "abcd0123456789"
m = is10.search(line)
print m.group(1)

line = "abcd0123456789efg"
m = is10.search(line)
print m.group(1)

【问题讨论】:

  • 请格式化您的代码以使其可读

标签: python regex


【解决方案1】:

您必须用括号而不是方括号对备选方案进行分组:

r'\D(\d{9}[\dXx])($|\D)'

|[] 是不同的构造。它标志着两种模式之间的替代,而[] 匹配其中一个包含的字符。所以| 只能在[] 内部使用,如果你想匹配实际字符|。部分模式的分组是用括号完成的,所以这些应该用来限制|标记的替代的范围。

如果您想避免这会创建匹配组,您可以改用(?: )

r'\D(\d{9}[\dXx])(?:$|\D)'

【讨论】:

  • [\d|X|x] 你觉得它有什么作用?
  • [\d|X|x] 匹配以下之一:数字、X、x 或 |。 re.search('[a|b]', '|') 产生匹配。
【解决方案2】:
\D(\d{10})(?:\Z|\D)

查找非数字后跟 10 位数字,以及单个非数字或字符串结尾。仅捕获数字。虽然我看到您正在搜索 9 位数字或 Xx,但我在您的要求中没有看到相同的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多