Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Regex 如何在Python3中使用正则表达式从文本字符串中识别大写的invite代码?_Regex_Python 3.x - Fatal编程技术网

Regex 如何在Python3中使用正则表达式从文本字符串中识别大写的invite代码?

Regex 如何在Python3中使用正则表达式从文本字符串中识别大写的invite代码?,regex,python-3.x,Regex,Python 3.x,我在试图从一个文本块中识别邀请代码时遇到了很多麻烦。我已经能够使用regex识别invite代码,因为它只包含大写字母,而不包含字母和数字 这就是我到目前为止的想法: 重新导入 text=“这是一个邀请代码:DG723BDA8。” 匹配=[] matches=re.findall(r“(\b(?[A-Z]+[A-Z]?[A-Z]*[A-Z]*[A-Z]?[A-Z]+)\b(?::\s+(?:[A-Z]+[A-Z]*[A-Z]*[A-Z]?[A-Z]*[A-Z]+)\b)*”),文本) 对于匹配中

我在试图从一个文本块中识别邀请代码时遇到了很多麻烦。我已经能够使用regex识别invite代码,因为它只包含大写字母,而不包含字母和数字

这就是我到目前为止的想法:

重新导入
text=“这是一个邀请代码:DG723BDA8。”
匹配=[]
matches=re.findall(r“(\b(?[A-Z]+[A-Z]?[A-Z]*[A-Z]*[A-Z]?[A-Z]+)\b(?::\s+(?:[A-Z]+[A-Z]*[A-Z]*[A-Z]?[A-Z]*[A-Z]+)\b)*”),文本)
对于匹配中的匹配:
匹配。追加(匹配)
inviteCode=匹配的[0]
此代码可以识别邀请代码(如WEVFAAJVF),然后选择第一个,但不能选择包含数字的代码。因此,为了澄清,在理想情况下:

“这里有一个邀请代码:ASHDhja,尽情享受!”-不会返回任何内容。
“这里有一个邀请代码:WSHSJH,尽情享受!”-将返回WSHSJH。
“这是一个邀请代码:BJF4A723,请欣赏!”-将返回BJF4A723。
“这里有一个邀请代码:asdh32d,尽情享受!”-将不返回任何内容。
“这是一个邀请代码:172DFHADD,尽情享受!”-将返回172DFHADD


非常感谢您的帮助。

非常感谢大家的评论,第四只鸟的这句话非常有效:

\b(?=[A-Z0-9]{2,}\b[A-Z0-9]*[A-Z][A-Z0-9]*\b

一个选项是使用正向前瞻
(?=
以确保至少有2个字符a-Z0-9(或根据您的要求调整量词)

然后使用量词
*
在至少匹配一个A-Z之前和之后匹配0次或更多次A-Z0-9

\b(?=[A-Z0-9]{2,}\b)[A-Z0-9]*[A-Z][A-Z0-9]*
部分地

  • \b
    单词边界
  • (?=
    正向前瞻,断言右边的是
    • [A-Z0-9]{2,}\b
      匹配2次或更多次A-Z或0-9
  • 关闭前瞻
  • [A-Z0-9]*
    匹配0+次A-Z0-9
  • [A-Z]
    至少匹配1次A-Z
  • [A-Z0-9]*
    匹配0+次A-Z0-9
|

使用示例代码:

import re

text = "Here's an invite code: DG723BDA8."
matched = []
matches = re.findall(r"\b(?=[A-Z0-9]{2,}\b)[A-Z0-9]*[A-Z][A-Z0-9]*\b",text)

for match in matches:
    matched.append(match)

inviteCode = matched[0]
print(inviteCode)
输出

DG723BDA8

因此必须始终存在大写字符?是否存在最小数量的字符?或者它们始终位于字符串的末尾?这也将匹配单个大写字符
\b[a-Z0-9]*[a-Z][a-Z0-9]*\b
如果它始终位于字符串的末尾,您可以简单地使用
\b[a-Z\d]+(?=\.$)
对不起,我给出的示例代码有误导性,它们并不总是8个字符长。它们通常至少为5个字符。如果必须至少有2个或更多字符,请尝试
\b(?=[a-Z0-9]{2,}\b)[a-Z0-9]*[a-Z][a-Z0-9]*\b
或将量词更新为所需的数量。抱歉,我更改了一些代码,使它们不是全部8个字符,并且我忘记更改结果。我添加了模式作为答案,并进行了解释。