我想用正则表达式从长字符串中提取数字。但我只想要8位数的数字。(字符串的前面和后面都不能有字母)但是可能会有一个开头的k。
请把下面的例子想象成一个大字符串的一部分。
12345678 -> i want this number
s12345678t -> i dont want this number
1234567 -> i dont want this number
123456789 -> i dont want this number
k12345678 -> i want this number (without the k -> the extracted number is 12345678)
sk12345678 -> i dont want this number
和我想用正则表达式
解决我的问题但是我不知道怎么做。
如果你能帮助我,那就太好了。谢谢!我尝试了很多,但它没有工作,我不知道这与正则表达式如何在我的例子
工作我的意思是,regex在一个单独的组中捕获8个数字,并允许您从"k"中单独访问它们。
你可以分析这个例子:
import re
string = "The numbers are 12345678, s12345678t, 1234567, 123456789, k12345678, and sk12345678."
numbers = re.findall(r'bk?(d{8})b', string)
print(numbers)
这将输出以下数字列表:
['12345678', '12345678']
您还可以将此正则表达式与其他支持正则表达式的编程语言或工具一起使用。
import re
string = "12345678 s12345678t 1234567 123456789 k12345678 sk12345678"
# Extract the numbers using the regular expression
numbers = re.findall(r"(?:^|D)(?<!k)(d{8})(?!d)", string)
print(numbers)
输出:
['12345678', '12345678']
解释:
(?:^|D)
:匹配字符串(^)
或任何非数字字符(D)
的开头。这用于确保数字前面没有任何字母或数字。
(?<!k)
:这是一个否定的向后看断言,确保数字前面没有字母"k"
。
(d{8})
:这正好匹配8位数字。括号捕获匹配的数字,以便可以提取它们。
(?!d)
:这是一个负向前看断言,确保数字后面没有任何数字。
试试这个模式:
bd{8}b|bkd{8}b
Regex演示。
bd{8}b
- 匹配8位数字
b
-字边界
或:
bkd{8}b
- 匹配
k
和8位数字 b
-字边界
- 匹配
import re
text = """
12345678 -> i want this number
s12345678t -> i dont want this number
1234567 -> i dont want this number
123456789 -> i dont want this number
k12345678 -> i want this number (without the k -> the extracted number is 12345678)
sk12345678 -> i dont want this number"""
pat = re.compile(r"bd{8}b|bkd{8}b")
for n in pat.findall(text):
print(n)
打印:
12345678
12345678
12345678