簡體   English   中英

Python 正則表達式,如何查找以大寫開頭后跟小寫的單詞?

[英]Python RegEx , how to find words that start with uppercase followed by lower case?

我有以下字符串

Date: 20/8/2020 Duration: 0.33 IP: 110.1.x.x Server:01

當我應用findall時,我將findall用作拆分字符串的一種方式,它拆分了 I & P 如何更改表達式以獲得此 output

['Date: 20/8/2020 ', 'Duration: 0.33 ', 'IP: 110.1.x.x ', 'Server:01'] 
text = "Date: 20/8/2020 Duration: 0.33 IP: 110.1.x.x Server:01"
my_list = re.findall('[a-zA-Z][^A-Z]*', text)
my_list

['Date: 20/8/2020 ', 'Duration: 0.33 ', 'I', 'P: 110.1.x.x ', 'Server:01']

查找以兩個大寫字母或一個大寫字母后跟一個小寫字母開頭的任何字符串,然后進行匹配,直到找到相同的模式或行尾。

>>> re.findall(r'([A-Z][a-zA-Z].*?)\s*(?=[A-Z][a-zA-Z]|$)', text)
['Date: 20/8/2020', 'Duration: 0.33', 'IP: 110.1.x.x', 'Server:01']

您可能還希望使用它來創建字典。

>>> dict(re.split(r'\s*:\s*', m, 1) for m in re.findall(r'([A-Z][a-zA
-Z].*?)\s*(?=[A-Z][a-zA-Z]|$)', text))
{'Date': '20/8/2020', 'Duration': '0.33', 'IP': '110.1.x.x', 'Server': '01'}

使用正則表達式,您應該始終盡可能精確。 所以如果你知道你的輸入數據看起來總是那樣,我建議用 Regex 寫完整的單詞。

如果那不是你想要的,你必須犧牲確定性:

  1. 更改 Regex 以接受任何包含任何大小字母的單詞 position
  2. 添加大寫字母 P 如下字母
  3. 添加 IP 作為特殊情況

您可以使用:

(?<!\S)[A-Z][a-zA-Z]*:\s*\S+

解釋

  • (?<!\S)
  • [AZ][a-zA-Z]*:匹配大寫字符 AZ,可選字符 a-zA-Z 后跟:
  • \s*\S匹配可選的空白字符和 1+ 個非空白字符

正則表達式演示

import re

pattern = r"(?<!\S)[A-Z][a-zA-Z]*:\s*\S+"
s = "Date: 20/8/2020 Duration: 0.33 IP: 110.1.x.x Server:01"
print(re.findall(pattern, s))

Output

['Date: 20/8/2020', 'Duration: 0.33', 'IP: 110.1.x.x', 'Server:01']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM