Regex 如何在Python3中使用正则表达式从文本字符串中识别大写的invite代码?
我在试图从一个文本块中识别邀请代码时遇到了很多麻烦。我已经能够使用regex识别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)*”),文本) 对于匹配中
重新导入
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
正向前瞻,断言右边的是(?=
匹配2次或更多次A-Z或0-9[A-Z0-9]{2,}\b
关闭前瞻)
匹配0+次A-Z0-9[A-Z0-9]*
至少匹配1次A-Z[A-Z]
匹配0+次A-Z0-9[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个字符,并且我忘记更改结果。我添加了模式作为答案,并进行了解释。