/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Network Automation #003 - Netmiko Backup VLAN Configuration on Cisco IOS Switch

 Nên xem các bài dưới đây trước khi xem bài này:


Sơ đồ lab:


Yêu cầu:

Dùng thư viện netmiko để SSH vào và thực hiện backup cấu vlan trên switch


Chuẩn bị:

        Sw:

enable
conf t
hostname Sw1
ip domain name netmiko.lab

username admin privilege 15 password admin1234@sw1

line vty 0 4
login local
transport input ssh
crypto key generate rsa general-keys modulus 1024
ip ssh version 2

interface vlan 1
no shutdown
ip address 192.168.0.8 255.255.255.0
exit

vlan 10-20
do wri


Thực hiện:

from netmiko import ConnectHandler 
from datetime import datetime

bk_device = { 
	"host":"192.168.0.8",
	"username":"admin",
	"password":"admin1234@sw1",
	"device_type":"cisco_ios" 
	}

tftpserver = "192.168.0.48" 

def cisco_ios_sw(txt): # định nghĩa hàm backup VLAN cho switch cisco ios
	
	cmd = "copy vlan.dat tftp:"
	filename = txt + "vlan.dat"
	
	net_connect = ConnectHandler(**bk_device)

	output = net_connect.send_command_timing(cmd)
	if "Address or name of remote host []" in  output:
		output += net_connect.send_command_timing(tftpserver)
	if "Destination filename" in output:
		output += net_connect.send_command_timing(filename)

	print(output)
	print("-" * 80)	


print(f"Dang ket noi vao IP:'{bk_device['host']}' voi Username: '{bk_device['username']}'")	

now = datetime.now().strftime("%Y-%b-%d_%H%M%S")
filename = now + "_" + bk_device["device_type"] + "_" + bk_device["host"] 

cisco_ios_sw(filename)


  • Kết quả:

C:\python>python Demo.py

Dang ket noi vao IP:'192.168.0.8' voi Username: 'admin'

Address or name of remote host []? Destination filename [vlan.dat]? !!

2076 bytes copied in 0.025 secs (83040 bytes/sec)

--------------------------------------------------------------------------------

C:\python>


Xong!

Học Python Qua Ví Dụ #022 - Module Trong PyThon

Cũng giống như Function, Module cho phép tái sử dụng code lại nhiều lần. Với Function thì các hàm phải được định nghĩa trước đó và sau đó gọi hàm ra mà dùng. Với Module nó bao gồm các lớp (class), các hàm (function), các biến,...mà chúng ta đã gom/phân thành từng module. Khi sử dụng nó chúng ta chỉ cần IMPORT nó vào mà sử dụng KHÔNG CẦN phải viết lại.

Ví dụ chúng ta có file vck_func.py với nội dung:

import re
def MAC_Win2Cisco(mac_addr): 
	'''
	chuyển định dạng MAC address của Windows sang định dạng Cisco
	Dữ liệu đầu VÀO có dạng "11:22:33:44:55:66" HOẶC "11-22-33-44-55-66"
	KẾT QUẢ:"1122.3344.5566"
		
	'''
	mac_addr = re.sub("[-:]","",mac_addr)
	new_mac = []
	while len(mac_addr) > 0:
		entry = mac_addr [:4]
		mac_addr = mac_addr [4:]
		new_mac.append(entry) 

	new_mac = ".".join(new_mac)
	return new_mac


def MAC_Cisco2Win(mac_addr): 
	'''
	Chuyển định dạng MAC address của cisco sang windows
	Dữ liệu vào:"1122.3344.5566"
	KẾT QUẢ: "11:22:33:44:55:66"
	'''
	mac_addr = re.sub("[.]","",mac_addr)
	new_mac = []
	while len(mac_addr) > 0:
		entry = mac_addr [:2]
		mac_addr = mac_addr [2:]
		new_mac.append(entry) 

	new_mac = ":".join(new_mac)
	return new_mac
	

def ipv4_chk(ip_addr):
	'''
	Kiểm tra ip nhập vào có hợp lệ không
	IP hợp lệ phải có 4 otects
	Mỗi otect phải là số trong khoảng [0-255]
	'''	
	octets = ip_addr.split(".")
	if len(octets) != 4:
		return False
	
	for x in octets:
		if not x.isdigit() or int(x) < 0 or int(x) > 255:
			return False
		return True	


Để sử dụng các hàm trên chúng ta thực hiện:

  • Import vck_func 
  • Dùng hàm dir để xem trong file vck_func có những hàm nào

import vck_func
		
print(dir(vck_func))


kết quả:

C:\python>python Demo.py

['MAC_Cisco2Win', 'MAC_Win2Cisco', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'ipv4_chk', 're']

C:\python>


phần highlight màu vàng là các hàm chúng ta đã định nghĩa trong file vck_func.py

  • Ví dụ sử dụng hàm MAC_Win2Cisco

Cách 1: gọi gián tiếp, cú pháp import <tên file thư viện cần import>

Code:

import vck_func

Mac_Cisco = vck_func.MAC_Win2Cisco("aa:cc:bb:dd:ee:ff")
	
print(Mac_Cisco)


Kết quả:

C:\python>python Demo.py

aacc.bbdd.eeff

C:\python>


Cách 2: Gọi trực tiếp, cú pháp from  <tên file thư viện cần import> import <tên hàm, hoặc class>

from vck_func import MAC_Win2Cisco

Mac_Cisco = MAC_Win2Cisco("aa:cc:bb:dd:ee:ff")
	
print(Mac_Cisco)


Tùy từng trường hợp mà chúng ta có thể dùng cách 1 hoặc cách 2

Xong!

Học Python Qua Ví Dụ #021 - Function/Hàm Trong PyThon

Functon/Hàm: Thay vì chúng ta sử dụng các hàm đã được định nghĩa của python thì bây giờ chúng ta có thể TỰ ĐỊNH NGHĨA ra các hàm riêng cho mình. Hàm có tác dụng vô cùng quan trọng là tránh việc phải lặp lại nhiều lần một đoạn code để thực thi những tác vụ tương tự nhau, giúp code gọn hơn và có thể tái sử dụng. 


  • Ví dụ SSH Connection

Code:

def ssh_conn(ip_addr, username, password):
    print("-" * 30)
    print("IP Addr: {}".format(ip_addr))
    print("Username: {}".format(username))
    print("Password: {}".format(password))
    print("-" * 30)

'''
Với cách gọi này hàm ssh_conn sẽ hành xử là gán THEO THỨ TỰ từ trái sang -> phải:
- giá trị: "192.168.1.1" sẽ gán vào biến ip_addr
- giá trị:"admin" sẽ gán vào biến username
- giá trị: "cisco123" sẽ gán vào biến password
'''
ssh_conn("192.168.1.1", "admin", "cisco123")

'''
khai báo biến KHÔNG cần theo THỨ TỰ, nó sẽ tìm đúng biến mà gán vào
'''
ssh_conn(username="admin", ip_addr="192.168.1.1", password="cisco123")

# Cũng có thể gọi theo kiểu KẾT HỢP 2 cách trên
ssh_conn("192.168.1.1", password="cisco123", username="admin1")


Kết quả:

C:\python>python Demo.py

------------------------------

IP Addr: 192.168.1.1

Username: admin

Password: cisco123

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin

Password: cisco123

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin1

Password: cisco123

------------------------------


C:\python>python Demo.py

------------------------------

IP Addr: 192.168.1.1

Username: admin

Password: cisco123

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin

Password: cisco123

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin1

Password: cisco123

------------------------------


C:\python>


  • Ví dụ SSH Connection 2

Code:

def ssh_conn2(ip_addr, username, password, device_type="cisco_ios"):
    print("-" * 30)
    print("IP Addr: {}".format(ip_addr))
    print("Username: {}".format(username))
    print("Password: {}".format(password))
    print("Platform: {}".format(device_type))
    print("-" * 30)


ssh_conn2(
    "192.168.1.1", password="cisco123", username="admin1", device_type="cisco_nxos"
)

'''
Khi gọi hàm nếu không truyền giá trị của device_type vào thì nó sẽ lấy giá trị mặc định
Trong trường hợp này giái trị mặc định là: device_type="cisco_ios"
'''
ssh_conn2("192.168.1.1", password="cisco123", username="admin1")


'''
Chúng ta có thể định nghĩa Dictionary rồi gọi thông qua các key và value của dictionary
'''
my_device = {
    "ip_addr": "172.16.1.1",
    "device_type": "cisco_xr",
    "username": "admin",
    "password": "cisco123",
}
# hai dấu ** ngầm ý là cho phép truyền key và value của my_device vào hàm ssh_conn2
ssh_conn2(**my_device)


Kết quả:

C:\python>python Demo.py
------------------------------

IP Addr: 192.168.1.1

Username: admin1

Password: cisco123

Platform: cisco_nxos

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin1

Password: cisco123

Platform: cisco_ios

------------------------------

------------------------------

IP Addr: 172.16.1.1

Username: admin

Password: cisco123

Platform: cisco_xr

------------------------------


C:\python>


Tham khảo hàm trả về nhiều giá trị 

Xong!

Học Python Qua Ví Dụ #020 - Set Trong Python

 Các hành động trong Set:

Toán Tử

Ký Hiệu

Mô Tả

Union

|

Kết hợp/ lấy tất cả các Set

Intersection

&

Chỉ lấy phần giao nhau

Symmetric Difference

^

KHÔNG lấy phần giao nhau

Difference

-

Chỉ lấy phần TỒN TẠI set_1 mà không tồn tại ở set_2


Hình các hành động trong Set

Ví dụ:
Code:
'''
Có 3 list được định nghĩa với các IP như dưới

Yêu cầu: Dùng các hành động của Set để tìm các IP trùng nhau giữa:
1. Hà Nội và Đà Nẵng
2. Hà Nội và Hồ Chí Minh
3. Tất cả các site
4. Lấy IP của Hồ Chí Minh mà không trung với bất kỳ site nào
'''

HaNoi_ips = [
    "10.10.10.1",
    "10.10.20.1",
    "10.10.30.1",
    "10.10.40.1",
    "10.10.50.1",
    "10.10.60.1",
    "10.10.70.1",
    "10.10.80.1",
    "10.10.10.1",
    "10.10.20.1",
    "10.10.70.1",
]

DaNang_ips = [
    "10.10.10.1",
    "10.10.20.1",
    "10.10.30.1",
    "10.10.140.1",
    "10.10.150.1",
    "10.10.160.1",
    "10.10.170.1",
    "10.10.180.1",
]

HoChiMinh_ips = [
    "10.10.10.1",
    "10.10.20.1",
    "10.10.140.1",
    "10.10.150.1",
    "10.10.210.1",
    "10.10.220.1",
    "10.10.230.1",
    "10.10.240.1",
]

HaNoi_ips = set(HaNoi_ips)
DaNang_ips = set(DaNang_ips)
HoChiMinh_ips = set(HoChiMinh_ips)

# 1. Hà Nội và Đà Nẵng (Dùng set intersection)
print()
print("-" * 80)
print(
    "Duplicate IPs Ha Noi va Da Nang:\n\n{}".format(
        HaNoi_ips & DaNang_ips
    )
)
print("-" * 80)

# 2. Hà Nội và Hồ Chí Minh (Dùng set intersection)
print()
print("-" * 80)
print(
    "Duplicate IPs Ha Noi va Ho Chi Minh:\n\n{}".format(
        HaNoi_ips & HoChiMinh_ips
    )
)
print("-" * 80)

# 3. Tất cả các site
print()
print("-" * 80)
print(
    "Duplicate IPs tat ca cac sites:\n\n{}".format(
        HaNoi_ips & DaNang_ips & HoChiMinh_ips
    )
)
print("-" * 80)

# 4. Lấy IP của Hồ Chí Minh mà không trung với bất kỳ site nào
print()
print("-" * 80)
print(
    "Ho Chi Minh IP addresses difference:\n\n{}".format(
        HoChiMinh_ips.difference(HaNoi_ips).difference(DaNang_ips)      
    )
)

# HOẶC
print()
print("-" * 80)
print(
    "Ho Chi Minh IP addresses '-':\n\n{}".format(
        HoChiMinh_ips - DaNang_ips - HaNoi_ips
    )
)
print("-" * 80)
print()


Kết quả
C:\python>python Demo.py

--------------------------------------------------------------------------------
Duplicate IPs Ha Noi va Da Nang:

{'10.10.20.1', '10.10.10.1', '10.10.30.1'}
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
Duplicate IPs Ha Noi va Ho Chi Minh:

{'10.10.20.1', '10.10.10.1'}
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
Duplicate IPs tat ca cac sites:

{'10.10.20.1', '10.10.10.1'}
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
Ho Chi Minh IP addresses difference:

{'10.10.230.1', '10.10.210.1', '10.10.240.1', '10.10.220.1'}

--------------------------------------------------------------------------------
Ho Chi Minh IP addresses '-':

{'10.10.230.1', '10.10.210.1', '10.10.240.1', '10.10.220.1'}
--------------------------------------------------------------------------------


C:\python>

Xong!

Học Python Qua Ví Dụ #019 Bài Tập - Regular Expression

Xem lý thuyết RegEx ở đây

Xem format email ở đây


  • Ví dụ Extract Email:

Code:

'''
Yêu cầu:
Dùng RegEx để lấy ra tất cả các địa chỉ email từ chuỗi txt (kết quả đưa vào list)

'''
import re  

txt = 'Hello from shubhamg+199630@gmail.com to pri.ya@yahoo.co.kr,pr_iya@yahoo.com,priya@yahoo to-ny@yahoo.com.vn about the meeting @2PM'

#regex ="[a-zA-Z0-9!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"

regex ="[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+" 
email = re.findall(regex, txt)     
  
print(email)


Kết quả:

C:\python>python Demo.py

['shubhamg+199630@gmail.com', 'pri.ya@yahoo.co.kr', 'pr_iya@yahoo.com', 'to-ny@yahoo.com.vn']

C:\python> 


  • Ví dụ Extract IPv4:

Code:

'''
Yêu cầu:
Dùng RegEx để lấy ra tất cả các địa chỉ IPv4 từ chuỗi txt (kết quả đưa vào list)

'''
import re  

txt = '12/30-04:09:41.070967 [**] [1:10000001:1] snort alert [1:0000001] [**] [classification ID: 0] [Priority ID: 0] {ICMP} 192.168.232.2:41676 -> 192.168.248.2:21'

#regex = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' # định dạng IPv4
#regex = r"[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}" # định dạng địa chỉ MAC
'''
HOẶC
'''
regex = r'\d{1,3}(?:\.\d{1,3}){3}'
IPs = re.findall(regex, txt)        

print(IPs)


Kết quả:

C:\python>python Demo.py

['192.168.232.2', '192.168.248.2']

C:\python>


  • Ví dụ Extract Số điện thoại:

Code:

import re
'''
Lấy ra tất cả các số điện trong chuỗi txt

'''
txt =''' so dien thoai (84)-899-723-572, so thu 2 +84 123.456.789, so thu 3 +84 123 456 789

'''

reg4 = re.compile(r"""(
    (\(\d+\)|\+\d+|\(\+\d+\))? # mã vùng, \+\d+: là dấu cộng, số xuất hiện 1 hoặc nhiều lần; \(\+\d+\): dấu mở ngoặc, dâu cộng, dấu đóng ngoặc; ()?: có thể có hoặc không
    (\-|\.|\s)? # dấu trừ, dấu chấm, dấu cách hoặc không có gì cả
    (\d+)
    (\-|\.|\s)?
    (\d+)
    (\-|\.|\s)?
    (\d+)
)""",re.VERBOSE)
match4 = reg4.findall(txt)
print (type(match4))
match4_phone = [match4[phone][0] for phone in range(len(match4))]
print(match4_phone)


Xong!

Học Python Qua Ví Dụ #018 - Regular Expression Trong Python

1. Regular Expression (RegEx) Funtions:
  • Match: Trả về kết quả THÀNH CÔNG hoặc None với mẫu trong chuỗi có cờ tùy chọn
  • Search: Trả về kết quả THÀNH CÔNG nếu tìm thấy hoặc None nếu không tìm thấy
  • Findall: Trả về danh sách chứa TẤT CẢ các kết quả tìm được
  • Sub: Tìm và thay thế một hoặc nhiều chuỗi nếu tìm thấy
  • Split: Trả về danh sách chứa các chuỗi con

2. Cú pháp pattern sử dụng RegEx trong Python:

Ký Hiệu Mô Tả Biểu Thức Giải Thích Kết Quả
. Bất kỳ ký tự nào
+ MỘT hoặc NHIỀU lần xuất hiện TRƯỚC nó x = re.findall("aix+", txt) Tìm kiếm chuỗi "aix" hoặc "aixxx" có trong chuỗi txt không
* không hoặc NHIỀU lần xuất hiện TRƯỚC nó x = re.findall("aix*", txt) Tìm kiếm chuỗi "ai" hoặc "aix" hoặc "aixxx" có trong chuỗi txt không
? không hoặc MỘT lần xuất hiện TRƯỚC nó x = re.findall("aix?", txt) Tìm kiếm chuỗi "ai" hoặc "aix" có trong chuỗi txt không
^ đại diện cho mẫu ĐỨNG ĐẦU một chuỗi x = re.findall("^aix", txt) Tìm kiếm chuỗi "aix" nếu mẫu đứng ở ĐẦU trong chuỗi txt
$ đại diện cho mẫu KẾT THÚC một chuỗi x = re.findall("aix$", txt) Tìm kiếm chuỗi "aix" nếu mẫu đứng ở CUỐI trong chuỗi txt
\d ký tự là số, tương đương từ 0->9 x = re.findall("\d", txt) Tìm một ký tự số (từ 0 đến 9) trong chuỗi txt
\D Chuỗi không chứa ký tự là số (ngược với \d), giống với [^0-9]
\s ký tự là khoảng trắng, tương đương [\t\n\r\f\v] x = re.findall("\s", txt) Trả về chuỗi CÓ chứa bất kỳ khoảng trắng nào
\S Ngược với \s, chuỗi KHÔNG CHỨA khoảng trắng, giống với [^\t\n\r\f\v] x = re.findall("\S", txt) Trả về chuỗi KHÔNG chứa bất kỳ khoảng trắng nào
[] Tập hợp các ký tự muốn khớp x = re.findall("[a-c]", txt) tìm các ký tự: "a" hoặc "b" hoặc "c" trong chuỗi txt
[^] Tập hợp các ký tự KHÔNG khớp x = re.findall("[^a-c]", txt) tìm các ký tự NGOẠI TRỪ: "a" hoặc "b" hoặc "c" trong chuỗi txt
{n} Tìm chính xác ký tự và n lần xuất hiện của ký tự x = re.findall("a{3}", txt) tìm ký tự "a" nếu nó xuất hiện 3 lần
{n,m} Khớp với ký tự xuất hiện 'n' lần nhưng không quá 'm' x = re.findall("al{2,3}", txt) tìm ký tự "a" và 2 ký tự "l" hoặc 3 ký tự "l" trong chuỗi txt
{n,} Chỉ khớp với ký tự khi nó xuất hiện 'n' lần trở lên re.findall("a{5,}", txt) Tìm và trả về kết quả nếu ký tự "a" xuất hiện ít nhất 5 lần
() Gom nhóm các mẫu lại với nhau
| Hoặc x= re.findall("(a|b|c)xz", txt) tìm kiếm trước xz là ký tự: "a" hoặc "b" hoặc "c"
\w Chuỗi chứa bất kỳ ký tự nào trong nhóm từ a tới Z, từ 0 tới 9 và dấu _ (underscore), giống với [a-zA-Z0-9_]
\W Ngược lại \w
?: Tìm không nhớ \d{1,3}(?:\.\d{1,3}){3} Tìm ký tự đầu tiên là số xuất hiện 1 đến 3 lần, tiếp đến ký tự "." và sau đó là ký tự số và chúng ( dấu chấm và số) phải xuất hiện đúng 3 lần Trả về chuỗi dạng IPv4
\+ là dấu cộng
\( là dấu mở ngoặc
\) là dấu đóng ngoặc
()? Có hoặc không có nhóm ký tự (nhóm ký tự đặt trong dấu ngoặc đơn)



  • Ví dụ re.match:
import re # import module re vào chương trình

'''
định nghĩa chuỗi mẫu có:
- chiều dài là: 5
- ký tự ĐẦU tiên là: a
- 3 ký tự GIỮA là: các ký tự bất kỳ
- ký tự CUỐI cùng là: z
'''
pattern = '^a...z$' 

test_in = input("Nhap vao chuoi: ")
result = re.match(pattern, test_in)
 
if result:
   print("Da TIM THAY chuoi.")
   print(result)
else:
   print("Chuoi nhap vao KHONG CO trong chuoi.")

Nếu chuỗi nhập vào thỏa mãn 4 điều kiện:
  • Chiều dài: 5
  • Ký tự ĐẦU: a
  • 3 ký tự GIỮA: 3 ký tự bất kỳ
  • Ký tự CUỐI:z
thì sẽ cho kết quả TÌM THẤY, ngược lại sẽ không tìm thấy.

  • Ví dụ re.search:
import re

'''
Tìm trong chuỗi txt nếu:
- ĐẦU là chữ: "The"
- GIỮA là CÓ hoặc KHÔNG CÓ bất kỳ ký tự nào
- CUỐI là chữ: "Spain"
'''

txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)

if x:
  print("Da TIM THAY chuoi!")
  print(x)
  # chỉ in ra nội dung của chuỗi nếu tìm thấy dùng
  print(x.group(0))
else:
  print("KHONG tim thay!")
  print(x)

  • Ví dụ re.findall:
import re

'''
Tìm "ai" trong chuỗi txt, tất cả các lần tìm thấy sẽ lưu vào biến x
Trong trường hợp này kết sẽ là: ['ai', 'ai']
'''
txt = "The rain in pain"
x = re.findall("ai", txt)

if x:
  print("Da TIM THAY chuoi!")
  print(x)
else:
  print("KHONG tim thay!")
  print(x)

  • Ví dụ re.sub:
import re

'''
Tìm khoảng trắng trong chuỗi txt nếu:
- Tìm thấy thì thay thế khoảng trắng bằng số 9
- và chỉ thay thế HAI(2) LẦN

=> KẾT QUẢ: "The9rain9in pain".
Trong chuỗi hiện tại có 3 dấu khoảng trắng nhưng CHỈ THAY 2 khoảng trắng đầu tiên tìm được

'''
txt = "The rain in pain"
x = re.sub("\s", "9", txt, 2)

if x:
  print("Chuoi da THAY THE!")
  print(x)
else:
  print("KHONG tim thay!")
  print(x)

  • Ví dụ re.split:
import re

'''
Tìm khoảng trắng trong chuỗi txt nếu:
- Tìm thấy thì TÁCH chuỗi
- và chỉ tách HAI(2) LẦN

=> KẾT QUẢ: ['The', 'rain', 'in pain'].
Trong chuỗi hiện tại có 3 dấu khoảng trắng nhưng TÁCH 2 khoảng trắng đầu tiên tìm được

'''
txt = "The rain in pain"
x = re.split("\s", txt, 2)

if x:
  print("Chuoi da TACH!")
  print(x)
else:
  print("KHONG tim thay!")
  print(x)


  • Ví dụ khác:

RegEx Mô Tả
\w{4}\.\w{4}\.\w{4} Có dạng 12 ký tự, được chia thành 3 cụm
Mỗi cụm này cách nhau bằng dấu chấm ".", mỗi cụm được phép lấy chính xác 4 ký tự
Các ký tự trong mỗi cụm có thể là: chữ, số, hoặc chữ số đó là ký tự gạch chân
[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4} Có dạng 12 ký tự, được chia thành 3 cụm (Định dạng MAC address trong cisco)
Mỗi cụm này cách nhau bằng dấu chấm ".", mỗi cụm được phép lấy chính xác 4 ký tự
Các ký tự trong mỗi cụm chỉ được phép lấy là:
- Các ký tự từ: a - f
- Các ký tự GHI HOA từ: A - F
- Các số tự nhiên từ: 0 - 9
[a-fA-F0-9]{4}(?:\.[a-fA-F0-9]{4}){2} Kết quả cuối cùng vẫn trả về định dạng MAC Address trong Cisco IOS
Cụm đầu tiên sẽ lấy là [a-fA-F0-9]{4}
Cụm thứ 2 gồm 2 cụm nhỏ tương tự như cụm đầu nhưng:
- Trước đó phải là ký tự dấu chấm "."
- Khi tìm thấy dấu chấm không được ghi nhớ nó (dấu chấm)
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} dạng số, được chia thành 4 cụm, mỗi cụm này cách nhau bằng dấu chấm "."
Các số được phép lặp lại từ 1 đến 3 lần
\d{1,3}(?:\.\d{1,3}){3} Tương tự chúng ta có cách viết rút gọn để lấy chuỗi có dạng địa chỉ IPv4

Xong!
/*header slide*/