python 如何获得下划线拆分单词的正则表达式代码?

yc0p9oo0  于 2023-03-07  发布在  Python
关注(0)|答案(3)|浏览(122)

我有一个问题,在我的项目。我想做什么?我需要得到所有的单词在python代码下划线分割:

text = "i.am - M_o_h_a_m_m_e_d - and - _1_5_y_o - name - moh_mmed - 2_8_j - i___a_m"
re.findall(r'?????' , text)

我需要得到:

['M_o_h_a_m_m_e_d','_1_5_y_o','i___a_m']

注意:如果单词以数字开头,如(15yo),则在起始数字前将加下划线

错误M_o_h_a_m_m_e_d,M_o_h_a_m_m_e_d
错误:1_5年

plupiseo

plupiseo1#

如果你想要一个纯正则表达式的解决方案,你可以使用下面的正则表达式,

\b(?:(?:[a-zA-Z]_+)+[a-zA-Z0-9]|(?:_+[a-zA-Z0-9])+)\b
    • 说明:**

这个正则表达式基本上是下面解释的两个子正则表达式的OR,

  • [a-zA-Z]_+)+[a-zA-Z0-9]-以单个字母开头,后跟一个或多个下划线,整个单词重复一次或多次,最后以字母或数字结尾
  • _+[a-zA-Z0-9])+-如果单词以下划线开头,则后面应跟一个字母或数字,并且重复出现一次

然后使用|?:对两个正则表达式进行OR运算,使用括号()使其成为一个非捕获组,然后您将得到上面提到的整个正则表达式。

    • 一个
bzzcjhmw

bzzcjhmw2#

下面是一个非正则表达式的方法:

text = "i.am - M_o_h_a_m_m_e_d - and - _1_5y_o - name - moh_mmed - 2_8_j - i___a_m"
result = []

for word in text.split(' - '):
    if word[0].isdigit() or word[0] == '_' and not word[1].isdigit():
        continue
    for char in word.split('_'):
        if len(char) > 1 and not (char[0].isdigit() ^ char[1].isdigit()):
            break
    else:
        result.append(word)

print(result)

输出:

['M_o_h_a_m_m_e_d', '_1_5y_o', 'i___a_m']

假设规则为:
1.单词用下划线分隔,但以下情况除外:
1.如果后面两个字符是数字和字母,并且
1.第一个位置的数字前面加下划线。
EDIT:使用来自注解的更新输入,代码简化了:

text = "i.am - M_o_h_a_m_m_e_d - and - _1_5_y_o - name - moh_mmed - 2_8_j - i___a_m"

result = [word for word in text.split(' - ') if not(word[0].isdigit() or word[0] == '_' and not word[1].isdigit() or any(len(char) > 1 for char in word.split('_')))]

print(result)

输出:

['M_o_h_a_m_m_e_d', '_1_5_y_o', 'i___a_m']
2g32fytz

2g32fytz3#

您可以使用正则表达式模式:

import re

text = "i.am - M_o_h_a_m_m_e_d - and - _1_5y_o - name - moh_mmed - 2_8_j - i___a_m"
result = re.findall(r"(?<!\d)_\w+", text)

print(result)

相关问题