【问题标题】:regex python pattern error正则表达式 python 模式错误
【发布时间】:2018-11-23 07:13:20
【问题描述】:

我正在使用以下正则表达式模式在文本文件中进行搜索:

  • 十六进制数(查找:1a2bc3d4e5 或 2369.235.26.158963 或 Aaa4)
  • 只有字母“a”或空格。可能有“a”、空格或混合 两个,但仅此而已。 :

在我的十六进制数字正则表达式下方:

matches = re.compile(' 0[xX][0-9a-fA-F]+ ')

在我的第二个模式的正则表达式下方:

matches = re.compile(r'^[a| ]*$')

不幸的是,它不起作用。 提前感谢您的帮助

【问题讨论】:

  • 从第一个 RE 中删除空格。此外,您的样本编号(1a2b、...等)的开头没有 0x。
  • 所以我用 re.compile('[0-9A-Fa-f]') 替换 re.compile(' 0[xX][0-9a-fA-F]+ ') :不匹配....
  • 请添加实际不匹配的数据示例和您用来匹配的代码。
  • 请将其作为原始问题的一部分,而不是评论。
  • 我想找到这些数据 :2369.235.26.158963 , Aaa4, AE456 , 1a2bc3d4e5f6, 1a2bc3d4e5f6g7 ,(0)1 52 69 78 56.My regex re.compile('[0-9A-Fa -f]') 什么也没找到。问候

标签: python regex hex


【解决方案1】:

老实说,有时我认为在提问时最好包含一些实际输入(或接近它的内容)和期望的输出。对于您的十六进制数字,我想知道您是要捕获值之前的 0x 还是避免它;其次,带有正则表达式原型的可变长度十六进制(稍微更正)会捕获诸如“def”、“bad”等内容。无论如何,拥有输入和所需的输出有助于理解问题。回答的人也是如此。

话虽如此,对于您的第一个正则表达式(因为我无法理解您想要的第二个),我倾向于使用“findall”,因为它更直接并且产生组匹配,因此使用以下输入(假设你知道我正在创建一个字符串来代替使用 file.read() 方法并使我的正则表达式捕获超过 4 个字符的字符串)

代码

import re

input = '''This is a hex number 0xAF67E49
This is NOT a hex number tgey736zde
This hex number 0xb34df49a appears in the middle of a sentence
This could be a hex number but has no letters 3689320'''

matches1 = re.findall('([0-9a-fA-F]{4,})', input)
matches2 = re.findall('0x([0-9a-fA-F]{4,})', input)
matches3 = re.findall('(0x[0-9a-fA-F]{4,})', input)

print('matches1: %s' % (str(matches1)))
print('matches2: %s' % (str(matches2)))
print('matches3: %s' % (str(matches3)))

输出

matches1: ['AF67E49', 'b34df49a', '3689320']
matches2: ['AF67E49', 'b34df49a']
matches3: ['0xAF67E49', '0xb34df49a']

说明

  • matches1 不加选择地匹配任何 4 个或更多字符且在十六进制范围内的内容。通过将输入中的“tgey736zde”更改为“tgey736de”来进行实验
  • matches2 有效地表示捕获任何超过 4 个字符且以 0x 开头的十六进制字符串,忽略 0x
  • matches3 有效地表示捕获任何超过 4 个字符且以 0x 开头的十六进制字符串,但包括 0x

额外信息

为了使这更有效,您可能还想研究如何使用前瞻

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多