从字符串中删除 r n r n

remove r n r n from string

我想从此字符串中删除多余的 r 和 n。我试过正则表达式。不确定正则表达式或其他一些方法在这里是否有用。

这是我尝试使用 import re

的代码
text = "r n r n r nFamily Medical History new r n  r n r r r  Roger nRobert n nDawson n49 nyears old , right shoulder"

regex_pattern = re.compile(r'\s[rn]\s')
matches = regex_pattern.findall(text)
for match in matches:
    text = text.replace(match," ")
print(text)

当前输出:

r nFamily Medical History new   Roger nRobert nDawson n49 nyears old , right shoulder 

我们仍然看到很多 r n。还想知道如何从 n49、nyears 中删除 'n' 并从 Dawson 中删除第一个 'n' 而不删除最后一个 'n'

预期输出:

Family Medical History new Roger Robert Dawson 49 years old , right shoulder

尝试这样的事情\b[rn](?=[A-Z0-9 ])

\b 查找任何工作边界(字符串的开头,spaces,换行符)。

[rn] 查找 'r' 或 'n'

(?=[A-Z0-9 ]) 查找任何大写字母、space 或数字,但不将它们包含在匹配项中。

检查 https://regex101.com/r/hSmYyi/1 以了解正则表达式和测试。

老派在这儿

>>> text = "r n r n r nFamily Medical History new r n  r n r r r  Roger nRobert n nDawson n49 nyears old , right shoulder"
>>> newText = []
>>> for word in text.split(' '):
...     if word and not (word == 'n' or word =='r'):
...         if not word[0] == 'n':
...             newText.append(word)
...         else:
...             newText.append(word[1:])
... 
>>> newText
['Family', 'Medical', 'History', 'ew', 'Roger', 'Robert', 'Dawson', '49', 'years', 'old', ',', 'right', 'shoulder']
>>> ' '.join(newText)
'Family Medical History ew Roger Robert Dawson 49 years old , right shoulder'
>>> 

当然你可以随意重构它。

我建议在这里使用一些 NLP 方法,因为我看不出正则表达式如何区分 nyears(错误拼写)和 new(正确拼写)。

首先,删除所有独立的 r / n 和粘在大写单词和数字上的那些,然后拆分字符串并检查以 n 或 [=13 开头的每个单词=] 与拼写检查器。如果 word[1:] 正确而 word 不正确,则可以删除第一个 n。如果两者都不正确,我认为回退到 word.

是安全的

以运行拼写检查为例,可以使用TextBlob.

这是一个 Python 代码演示:

from textblob import TextBlob
from textblob import Word
import re

s = "r n r n r nFamily Medical History new r n  r n r r r  Roger nRobert n nDawson n49 nyears old , right shoulder"
s = re.sub(r'\b[rn](?=[A-Z0-9\s]|$)', '', s)
result = []
for w in s.split():
  if not w.startswith(('n','r')): # The w word does not start with n or r...
    result.append(w)              # Add it to the result
  else:
    if Word(w).correct() == w:    # If w is a correct word
      result.append(w)            # Add it to the result
    else:
      if Word(w[1:]).correct() == w[1:]: # If w[1:] is correct 
        result.append(w[1:])             # Add w[1:] to the result
      else:
        result.append(w)                 # Fallback: add w to the result
print(" ".join(result))
# => Family Medical History new Roger Robert Dawson 49 years old , right shoulder

re.sub(r'\b[rn](?=[A-Z0-9\s]|$)', '', s) 部分删除单词开头的 rn 如果紧跟大写字母、数字或字符串结尾。

然后,for w in s.split(): 遍历句子中的单词,仅替换以 nr 开头且拼写错误为 [=28= 的单词].

免责声明:以TextBlob为例。您可以自由使用任何其他拼写检查库。 TextBlob spellchecking "is based on Peter Norvig’s “How to Write a Spelling Corrector”1 在模式库中实现。准确率约为 70%"